C与C++混合编程 extern 的问题!

bloodyRomantic 2008-11-22 12:00:33
问题核心:
extern "C"{int a;} 与 extern "C" int a; 有区别么?
extern "C"{...} 那么大括号内的内容是不是只是声明?

出现问题的场景:
VC6.0 下, a.c 文件内容:

int a = 10;


b.cpp文件内容:

#include <stdio.h>

#if 0
extern "C"
{
int a;
}

#else
extern "C" int a;

#endif

int main()
{
printf("%d\n",a);
return 0;
}


1. 如果#if 0,编译a.c , b.cpp 链接,没问题,运行 输出10.
2. 如果#if 1,编译a.c , b.cpp 链接,错误:error LNK2005: _a already defined in a.obj

提示:每次编译前把原来的obj都清除。
...全文
152 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jackzhhuang 2008-11-22
  • 打赏
  • 举报
回复
错了,有区别的,extern "c" int a还有引用外部变量的意思。呵呵
jackzhhuang 2008-11-22
  • 打赏
  • 举报
回复
1、
extern "C"
{
int a;
}

extern "C" int a;

没有区别,{}是方便你不用这样写:

extern "C" int a;
extern "C" int b;
extern "C" int b;

可以写成:
extern "C"
{
int a;
int b;
int c;
}

2、大括号里面不仅仅是可以声明,其实extern "C" 就是告诉编译器用C编译方法编译代码。
xhs_lh04 2008-11-22
  • 打赏
  • 举报
回复
#if 1
编译器执行的时
extern "C" int a;
这样,两层意思,声明了一个外部变量a,使用C语言的符号规则,这样编译能通过,因为你在a.c里定义了此变量

#if 0
extern "C"
{
int a;
}

定义了全局变量a,使用C标准引出符号,那么应该是_a,这样你在链接时就有两个全局变量_a,编译器检查就通过过
extern "C" {}的意思只是把{}内代码用C标准来编译引出符号,而不是extern声明外部变量,这是有区别的
bloodyRomantic 2008-11-22
  • 打赏
  • 举报
回复
谢谢各位!
也就是说:
extern "C" {...}并没有引入外部变量的意思;
而extern "C" ... 既是引入外部变量,又告诉编译器以c的方式编译。

[Quote=引用 1 楼 xhs_lh04 的回复:]
#if 1
编译器执行的时
extern "C" int a;
这样,两层意思,声明了一个外部变量a,使用C语言的符号规则,这样编译能通过,因为你在a.c里定义了此变量

#if 0
extern "C"
{
int a;
}

定义了全局变量a,使用C标准引出符号,那么应该是_a,这样你在链接时就有两个全局变量_a,编译器检查就通过过
extern "C" {}的意思只是把{}内代码用C标准来编译引出符号,而不是extern声明外部变量,这是有区别的
[/Quote]

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧