免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2780 | 回复: 8
打印 上一主题 下一主题

[C] 关于以下预编译与大括号问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-29 12:54 |只看该作者 |倒序浏览
#if !defined(wacs5_h)
#define wacs5_h

#ifdef __cplusplus
extern "C" {
#endif

void abc(int);
#ifdef __cplusplus
}

#endif

#endif


上述这个宏,我是从一个代码上面看到的,但是我不知道什么意思.主要是ifdef与{}两者我弄不到一起啊.主要就是上述红字标出的。

论坛徽章:
0
2 [报告]
发表于 2008-10-29 12:58 |只看该作者
#if !defined(wacs5_h)
#define wacs5_h

#ifdef __cplusplus
extern "C" {
#endif //__cplusplus

void abc(int);
#ifdef __cplusplus
}
#endif //__cplusplus

#endif //!defined(wacs5_h)

这样还有问题么?

论坛徽章:
0
3 [报告]
发表于 2008-10-29 13:02 |只看该作者
最近的ifdef和最近的endif组合看看

论坛徽章:
0
4 [报告]
发表于 2008-10-29 13:02 |只看该作者
#if !defined(wacs5_h)
#define wacs5_h

void abc(int);

#endif



#if !defined(wacs5_h)
#define wacs5_h

extern "C"
{
void abc(int);
}

#endif

论坛徽章:
0
5 [报告]
发表于 2008-10-29 13:10 |只看该作者
还是这里快,
我只是把{}
看成一个完整的块来看了

明白了。

论坛徽章:
0
6 [报告]
发表于 2008-10-29 13:11 |只看该作者
顺便再一句:


extern "C"
{
void abc(int);
}
这个是什么意思呢?

论坛徽章:
0
7 [报告]
发表于 2008-10-29 13:13 |只看该作者
原帖由 wacs5 于 2008-10-29 13:11 发表
顺便再一句:


extern "C"
{
void abc(int);
}
这个是什么意思呢?

应该是c++中调用c中的函数

论坛徽章:
0
8 [报告]
发表于 2008-10-29 13:23 |只看该作者
准确的说,应该是告诉C++ 编译器,这段代码以C风格编译和链接

论坛徽章:
0
9 [报告]
发表于 2008-10-29 13:23 |只看该作者
原帖由 gawk 于 2008-10-29 13:13 发表

应该是c++中调用c中的函数



对啊。

建议楼主多用google

搜 #ifdef __cplusplus

还有 extern 'C'



C   compiler和C++   compiler将.c/.cpp编译成.obj时候给一个方法命名时候所采  
   
  用的方案是不同的,C   compiler比较简单,加一个下滑线"_",比如  
   
  foo()   =>   _foo。  
   
  而C++由于有了function   overload以及namespace等机制,稍微复杂了一些。比如  
   
  foo()   =可能=>   _@@@foo@_$$  
   
  当混合使用C和C++进行变成的时候,会出现一些问题,比如我现在有一个  
   
  a.obj,它是用C写的,里面有一个foo(),因此a.obj中它是_foo。  
   
  而现在我把这个.obj用于我的一个C++工程:  
   
  //b.cpp  
   
  void   foo()  
   
  int   main()   {  
  foo();  
  return   0;  
  }  
   
  当我用C++   compiler编译b.cpp的时候,foo这个方法会变成_@@@foo@_$$  
   
  然后存入obj中,接着我link   a.obj和b.obj,linker会从两个obj中  
   
  查找关于_@@@foo@_$$的定义,并且将他们连结起来,但是它找不到_@@@foo@_$$  
   
  的定义了,因为只有_foo的定义在a.obj中。  
   
  因此,要解决这个问题,必须要保持两个obj文件中foo的一致性,extern   "C"就是  
   
  解法,上面的程序改为:  
   
  extern   "C"   void   foo()  
   
  int   main()   {  
  foo();  
  return   0;  
  }  
   
  则,C++编译器就会采用C的命名方式,_@@@foo@_$$不会出现在b.obj中,而变成_foo。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP