C与C++混合编程,编译总结:
假设有三个文件 a.c a.h b.cpp
Ubuntu linux 上有 C语言编译器 gcc, 与c++ 编译器 g++
相关命令: gcc -c a.c, g++ -c b.cpp, gcc a.c b.cpp -l stdc++, gcc -E a.c -o a.E, gcc -S a.c, objdump -t a.o
void func(int a, int b)
{
printf("%d\n",a+b);
}
#ifdef __cplusplus
extern "C" //其中"C" 为c的大写,小写不支持
{
#endif
// C语言函数声明或实现
#ifdef __cplusplus
}
#endif
一, 当a.c 中只有c语言程序时
用gcc 编译会编译a成c标准程序, 这时__cplusplus 不会定义。 函数func()被编译成的符号为C语言标准 func
用g++ 编译时, 会按c++标准进行编译, 这时__cplusplus 会被定义, 函数func()被编译成的符号为C++标准 _Z4funcii
二, 当a.c 中包含C++代码时
用gcc 编译会出错, 这时用gcc用C语言标准进行编译,不支持c++
用g++ 编译时, 会按c++标准进行编译, 这时__cplusplus 会被定义, 函数func()被编译成的符号为C++标准 _Z4funcii,支持c++代码
三, b.cpp 中的代码,不管只有C++代码,还是只有C语言代码, 还是两者都有
用gcc 和g++ 编译时, 都会按c++标准进行编译, 这时__cplusplus 会被定义, 函数func()被编译成的符号为C++标准 _Z4funcii
四, 当代码用 c++标准进行编译时, 只要调用的函数声明,或定义的函数外部带有
extern "C"
{
void func(int a, int b);
}
编译时就按C语言标准进行链接,其符号为 func, 否则为C++标准的_Z4funcii
五, 用gcc 进行链接时,如果有.o代码为C++标准编译的符号, 要加上 -l stdc++ , 否则会报找不到符号。
六, 用g++进行链接时, 不管是否有C++标准编译的符号, 不需要加 -l stdc++