再请教 extern "C"的问题
我身边的一位介绍说
extern "C " int a;
和
extern "c "
{
int a;
int b;
}
的意义不一样,前者之中a 可以看成外部变量。
后者中extern "c "是一个完整的修饰符,a,b只是被认为是定义了一个 c 中的变量,不会被编译器认为是外部变量,他的这种说法对么?
[解决办法]
C++标准的解释:
extern "C " int i; // declaration
extern "C " {
int i; // definition
}
[解决办法]
可以试一下。
在头文件里声明extern "C " int a;
然后在源文件直接使用a,看会出link2001错误吗?
[解决办法]
一般标准头文件都有以下结构:
// Example.h
#ifndef __INCvxWorksh //
#define __INCvxWorksh //
#ifdef __cplusplus //
extern "C " {
#endif
/*整个.h头文件的内容*/
#ifdef __cplusplus
}
#endif
#endif /* __INCvxWorksh */
/*********
extern "C "
{
语句 //这里面的语句都受到extern "C "的修饰,包括#include等预编译语句。
}
**********/
用extern "C "修饰的名字表达了两个意思:// extern "C "只是c++中的关键字,c里没有。
1.这个名称是外部的 //与C中的extern含义相同,即使编译时找不到定义,链接时 //肯定找得到,典型的如库函数。
2.对被修饰名称是按照C风格编译和链接的。 //除了函数会名字改编外,数据成员 //也会名字改编。
这样用来防止在一个cpp文件中多次包含同一个头文件。用来保证C++可以使用C写的库,C想使用C++写的库时:对于简单的C++函数库,在C++函数前声明extern "C "之后导出,还是可以的。但是打算作为通用库,这个就别想了,最起码的重载函数C就调用不了,典型的如codebase的函数库。
[解决办法]
前者之中a 可以看成外部变量。
后者中extern "c "是一个完整的修饰符,a,b只是被认为是定义了一个 c 中的变量,不会被编译器认为是外部变量,他的这种说法对么?
我的理解,正确