关于extern "C"一直在用,对其作用也算了解,但其道理或者叫工作原理却一无所知~
刚才看了《xxx的自我修养》中的3.5.4,才知道,用extern "C",原来是与编译器的“符号名”相关的~下面的代码最能说明extern "C"问题和来由~
#include <stdio.h>
namespace myname
{
int var = 42;
}
extern "C"
{
double _ZN6myname3varE;
}
int main()
{
printf("%d\n", _ZN6myname3varE);
return 0;
}
上面的代码是从书中COPY来的,书上说其运行结果是--42;
但我运行的结果如下:
fire1>g++ ecp.cpp -o ecp
/usr/ccs/bin/as: "/var/tmp//cctSG3Jm.s", line 14: error: redefinition of symbol "_ZN6myname3varE"
/usr/ccs/bin/as: "/var/tmp//cctSG3Jm.s", line 13: warning: size of "_ZN6myname3varE" redefined
虽然我没有得到结果,但要说明extern "C"的目的是达到了。
我的这边的环境如下:
fire1>uname -a
SunOS fire1 5.8 Generic_108528-21 sun4u sparc SUNW,Sun-Fire-880
fire1>gcc -v
Reading specs from /usr/local/lib/gcc-lib/sparc-sun-solaris2.8/3.3.2/specs
Configured with: ../configure --with-as=/usr/ccs/bin/as --with-ld=/usr/ccs/bin/ld --disable-nls
Thread model: posix
gcc version 3.3.2
extern "C"这个问题最典型或者叫最常见的代码样子如下:
#ifdef __cplusplus
extern "C" {
#endif
void* memset(void*, int, size_t);
#ifdef __cplusplus
}
#endif