ifdef _cplusplus extern "c"的说明

来源:互联网 发布:大数据的收集 编辑:程序博客网 时间:2024/05/05 14:42
楼主发表于: 2008-07-30 15:48:11
#ifdef __cplusplus
extern "C" {
#endif
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
回复次数:15
#1 得分:0回复于: 2008-07-30 15:52:21
C/C++ code
?
1
2
3
#ifdef __cplusplus //c++编译环境中才会定义__cplusplus (plus就是"+"的意思)
extern "C" //告诉编译器下面的函数是c语言函数(因为c++和c语言对函数的编译转换不一样,主要是c++中存在重载)
#endif
社区问答第5期:秦小波 设计模式之禅
对我有用[2] 丢个板砖[0] 引用 | 举报 | 管理
#2 得分:0回复于: 2008-07-30 16:02:51
预编译命令 相当于 if elseif 这类东西 具体的看看书
CSDN投诉事项说明
对我有用[0] 丢个板砖[2] 引用 | 举报 | 管理
#3 得分:0回复于: 2008-07-30 16:05:03
就是当是用C++编译的时候
extern "C"里面的东西还是按照C的方式来编译
技术牛人的蜕变之路-专访陆其明
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
#4 得分:0回复于: 2008-07-30 16:19:51
引用 1 楼 yuwei2589 的回复:
C/C++ code
#ifdef __cplusplus //c++编译环境中才会定义__cplusplus (plus就是"+"的意思)
extern "C" { //告诉编译器下面的函数是c语言函数(因为c++和c语言对函数的编译转换不一样,主要是c++中存在重载)
#endif
up
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
#5 得分:0回复于: 2008-07-30 16:24:55
C++编译器编译时生成函数名称的规则和C编译器不一样,如果是在C++中使用用C语言编译器编译生成的库文件,就需要用这个,防止C++编译器链接不到函数。
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
#6 得分:10回复于: 2008-07-30 16:25:09
#ifdef __cplusplus  //如果是c++程序,肯定会有__cplusplus
extern "C" {       //下面程序采用c方式编译,因为c中没有重载,c++中有。编译时转换规则不一样
#endif
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
#7 得分:0回复于: 2008-07-30 16:34:40
编译开关,当define了。。。,就。。。否则,不。。。
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
#8 得分:0回复于: 2008-11-17 16:57:13
为什么#endif紧挨“{”后面,而不是等“{”里面内容全写完再写#endif,是规定的格式吗?
对我有用[1] 丢个板砖[0] 引用 | 举报 | 管理
#9 得分:0回复于: 2008-11-17 17:46:25
引用 8 楼 y12835 的回复:
为什么#endif紧挨“{”后面,而不是等“{”里面内容全写完再写#endif,是规定的格式吗?
那样的话C程序再引用头文件就看不到那些声明了。
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
#10 得分:10回复于: 2008-11-17 18:03:48
其实很简单,作用就是
如果此头文件是在c++中使用的(就是一个.cpp文件include此头文件,而不是一个.c文件),
那么函数名称粉碎方式仍然使用C中的方式。(就是此函数编译后在object文件中的内部名称和C中是兼容的)

比如
void foo1();
如果c文件包含了它,生成的object文件中此函数被命名为 c_foo1,
而在cpp文件中包含了它,生成的object中此函数命名为cpp_foo1,使用extern "C"后,可以强制使其仍然为"c_foo1"。
这么做的目的是为了在c和cpp中互相调用函数命名一致,否则会出现链接错误。
对我有用[1] 丢个板砖[0] 引用 | 举报 | 管理
#11 得分:0回复于: 2008-11-22 16:28:12
const char * type2str(int type)
{
    if (type==XVID_TYPE_IVOP)
        return "I";
    if (type==XVID_TYPE_PVOP)
        return "P";
    if (type==XVID_TYPE_BVOP)
        return "B";
    return "S";
}


请问return "S"是什么意思?
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
#12 得分:0回复于: 2010-05-01 22:15:50
谢谢指点,我也遇到了这个问题了
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
#13 得分:0回复于: 2011-05-12 15:05:30
路过,来看看,有收获
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
#14 得分:0回复于: 2012-02-08 16:36:31
const char * type2str(int type)
{
   if (type==XVID_TYPE_IVOP)
   return "I";
   if (type==XVID_TYPE_PVOP)
   return "P";
   if (type==XVID_TYPE_BVOP)
   return "B";
   return "S";
}

是说  当 type != XVID_TYPE_IVOP && type != XVID_TYPE_PVOP && type != XVID_TYPE_BVOP 
就返回 "S" 
对我有用[0] 丢个板砖[0] 引用 | 举报 | 管理
#15 得分:0回复于: 2012-08-09 09:48:19
学习学习
0 0
原创粉丝点击