[C/CPP系列知识] C++中extern “C” name mangling -- Name Mangling and extern “C” in C++

http://www.geeksforgeeks.org/extern-c-in-c/

 

C++函数重载(function overloading),但是C++编译器是如何区分不同的函数的呢?----是通过在函数名是加些信息来区不同的函数,即所谓的Name Mangling。C++标准并没有对name mangling技术,各个编译器可以添加不同的信息。

 

考虑下面的函数

int  f (void) { return 1; }
int  f (int)  { return 0; }
void g (void) { int i = f(), j = f(0); }

C++编译器也许会重命名为 (Source: Wiki)

int  __f_v (void) { return 1; }
int  __f_i (int)  { return 0; }
void __g_v (void) { int i = __f_v(), j = __f_i(0); }

C++链接器如何处理C语言中的符号呢?

C语言不支持函数重载,所以没有name mangling技术,那么在C++中使用了C函数后如何保证C++链接器能够正取的链接呢?

// Save file as .cpp and use C++ compiler to compile it
int printf(const char *format,...);
 
int main()
{
    printf("GeeksforGeeks");
    return 0;
}

编译结果:

diego@ubuntu:~/myProg/geeks4geeks/cpp$ g++ test11.cpp 
test11.cpp:1:2: error: invalid preprocessing directive #int
 #int printf(const char *format,...);
  ^
test11.cpp: In function 'int main()':
test11.cpp:5:29: error: 'printf' was not declared in this scope
     printf("GeeksforGeeks\n");
                             ^
diego@ubuntu:~/myProg/geeks4geeks/cpp$

编译错误的原因是C++编译器对printf函数进行了name mangling,然后找不到重命名后的函数的符号。解决办法就是使用extern "C" 关键字。

// Save file as .cpp and use C++ compiler to compile it
extern "C"
{
    int printf(const char *format,...);
}
 
int main()
{
    printf("GeeksforGeeks");
    return 0;
}

输出结果:

diego@ubuntu:~/myProg/geeks4geeks/cpp$ g++ test11.cpp 
diego@ubuntu:~/myProg/geeks4geeks/cpp$ ./a.out 
GeeksforGeeks

所以,所有的C语言的库函数都要包含在extern “C” block中。

#ifdef __cplusplus 
extern "C" {
#endif
    /* Declarations of this file */
#ifdef __cplusplus
}
#endif

 

posted @ 2015-06-16 21:49  穆穆兔兔  阅读(557)  评论(0编辑  收藏  举报