由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 关于C++中 extern "C"的问题。
相关主题
Urgent question: AIX, C++11, Shared Object不用头文件,如何调用函数?C++
老哥使用的一项技术: extern定义全局变量[合集] 如果在自己的程序里调用external program (C++/Linux)
弱问c++里有没有NULL这个keyword?C++ questions
【请教】mpicc 和 mpiCC编译问题怎样清理不要的C代码
怎样include一个函数弱问一个ifdef 和ifndef
purify和valgrind的比较makefile 里面那个-D flags的问题
弱问C++一个问题 一直不解关于程序必须支持win and linux, 可不可以用class而不是#ifdef WIN32 ?
c function 在 c里调用和C++调用结果不一样#ifdef _MSC_VER 是什么意思啊?
相关话题的讨论汇总
话题: c++话题: 函数话题: extern话题: parser话题: 调用
进入Programming版参与讨论
1 (共1页)
d**d
发帖数: 389
1
有没有详细的说明什么情况下定义的函数要加extern "C"啊?
1. 没有使用/调用class的函数都属于 C 函数?
2. 只是用standard C library的函数? 就是只调用stdio.h, stdlib.h....的函数?
3. 哪些调用cstdio,cstdlib的函数是不是属于C 函数?
y***d
发帖数: 2330
2
if the function source is in a .c (i.e., compiled as c), then add it.

【在 d**d 的大作中提到】
: 有没有详细的说明什么情况下定义的函数要加extern "C"啊?
: 1. 没有使用/调用class的函数都属于 C 函数?
: 2. 只是用standard C library的函数? 就是只调用stdio.h, stdlib.h....的函数?
: 3. 哪些调用cstdio,cstdlib的函数是不是属于C 函数?

d**d
发帖数: 389
3
比如我已经用C写好了几个独立的函数去处理一个xml文件,调用的库是现有的libxml2,
这个是标准的C library.
在parser.c中,
#include
#include
#include
void parser();
1. 如果我把这个文件放到我其他的C++程序中,还是parser.c,那么在调用G++编译的
时间,parser.c就要变成
#ifdef _cplusplus
extern "C"{
endif
void parser();
#ifdef _cplusplus
}
#endif
是这样吧?
2. 如果我重新生成一个parser.cpp文件:
#include
#include
#include
void parser();
这样的话,用g++来编译就没有问题了?
谢谢。

【在 y***d 的大作中提到】
: if the function source is in a .c (i.e., compiled as c), then add it.
a****l
发帖数: 8211
4
It simply means the function is defined in C style. Does not necessarily
mean the function is from standard C library, although apparently functions
from standard C library would be definitely defined in C style.

【在 d**d 的大作中提到】
: 有没有详细的说明什么情况下定义的函数要加extern "C"啊?
: 1. 没有使用/调用class的函数都属于 C 函数?
: 2. 只是用standard C library的函数? 就是只调用stdio.h, stdlib.h....的函数?
: 3. 哪些调用cstdio,cstdlib的函数是不是属于C 函数?

y***d
发帖数: 2330
5
把 parser.c "放到我其他的C++程序中" 这个做法是不好的,应该是把 parser.h 包含
到其它 .c/.cpp 文件中,
而 parser() 的函数体可以在 .c 中,也可以在 .cpp 中,
1. in c
parser.h
#ifdef _cplusplus
extern "C"{
#endif
void parser();
...
and complie parser.c with gcc
2. in cpp
parser.h
void parser();
and compile parser.cpp with g++

libxml2,

【在 d**d 的大作中提到】
: 比如我已经用C写好了几个独立的函数去处理一个xml文件,调用的库是现有的libxml2,
: 这个是标准的C library.
: 在parser.c中,
: #include
: #include
: #include
: void parser();
: 1. 如果我把这个文件放到我其他的C++程序中,还是parser.c,那么在调用G++编译的
: 时间,parser.c就要变成
: #ifdef _cplusplus

d**d
发帖数: 389
6
好像明白了一些。
1. 一个函数,调用标准的C库,stdio.h什么的,如果C++的程序想要调用这个函数的话
,那么在编译的实际就有两种选择:
a, 存在.c 文件中,用gcc来编译,需要加extern "C"。
b, 存在.cpp文件中,把所有的 stdlib.h等等换成 cstdlib等等,用g++来编译,不需
要加 extern "C".
对不对? 对于情况b,是不是必须把所有的 stdlib.h等等换成 cstdlib等等?
如果不换的话,用g++来编译会有什么问题吗?C++里面的cstdlib是不是完全等同于
stdlib.h?
以前一个项目要么是C++,要不就是全是C的。现在有一个项目需要用到一些很老的C写
的库,以前写的时间,完全没有想到要给C++用的,搞的现在很麻烦,又没有人去把这
些库用C++从新写。
谢谢了。

【在 y***d 的大作中提到】
: 把 parser.c "放到我其他的C++程序中" 这个做法是不好的,应该是把 parser.h 包含
: 到其它 .c/.cpp 文件中,
: 而 parser() 的函数体可以在 .c 中,也可以在 .cpp 中,
: 1. in c
: parser.h
: #ifdef _cplusplus
: extern "C"{
: #endif
: void parser();
: ...

y***d
发帖数: 2330
7
如果有一个老的库,用 C 写的,而现在要在 C++ 里面用它们,
可以在老的库的所有头文件里面加上 ifdef _cplusplus extern "C"{...
(默认你的老的库的头文件是齐全的,如果不齐全,man cproto)
不要去重写这些库,没必要。
大牛们也许有更恰当的方法...

包含

【在 d**d 的大作中提到】
: 好像明白了一些。
: 1. 一个函数,调用标准的C库,stdio.h什么的,如果C++的程序想要调用这个函数的话
: ,那么在编译的实际就有两种选择:
: a, 存在.c 文件中,用gcc来编译,需要加extern "C"。
: b, 存在.cpp文件中,把所有的 stdlib.h等等换成 cstdlib等等,用g++来编译,不需
: 要加 extern "C".
: 对不对? 对于情况b,是不是必须把所有的 stdlib.h等等换成 cstdlib等等?
: 如果不换的话,用g++来编译会有什么问题吗?C++里面的cstdlib是不是完全等同于
: stdlib.h?
: 以前一个项目要么是C++,要不就是全是C的。现在有一个项目需要用到一些很老的C写

X****r
发帖数: 3557
8

Use in declaration of the function for .cpp file that calls it.
Not for definition of the function itself.
Just keep using stdlib.h, unless you want to manually add
using namespace std; in the file.
Also, be aware that a piece of valid C code may not still be
valid in C++.

【在 d**d 的大作中提到】
: 好像明白了一些。
: 1. 一个函数,调用标准的C库,stdio.h什么的,如果C++的程序想要调用这个函数的话
: ,那么在编译的实际就有两种选择:
: a, 存在.c 文件中,用gcc来编译,需要加extern "C"。
: b, 存在.cpp文件中,把所有的 stdlib.h等等换成 cstdlib等等,用g++来编译,不需
: 要加 extern "C".
: 对不对? 对于情况b,是不是必须把所有的 stdlib.h等等换成 cstdlib等等?
: 如果不换的话,用g++来编译会有什么问题吗?C++里面的cstdlib是不是完全等同于
: stdlib.h?
: 以前一个项目要么是C++,要不就是全是C的。现在有一个项目需要用到一些很老的C写

b***i
发帖数: 3043
9
比较重要的是混用C++编译器和C编译器。C++ mangle你的函数名字
如果有lib,或者so是C++编译的,有些是C,则被lib,so外面的程序调用的函数要
extern "C", 否则,最后的链接找不到这些函数。尤其SO的时候,哪怕都是C++编译的
,用库的程序想呼叫库里的函数,也必须用。
如果你只有一个单独的项目,没有库给别人用,程序用一个编译器编译链接完成,不需
要这个东西。标准的库里面如果有C函数,.h都已经有了extern "C",也不需要你写。

【在 d**d 的大作中提到】
: 有没有详细的说明什么情况下定义的函数要加extern "C"啊?
: 1. 没有使用/调用class的函数都属于 C 函数?
: 2. 只是用standard C library的函数? 就是只调用stdio.h, stdlib.h....的函数?
: 3. 哪些调用cstdio,cstdlib的函数是不是属于C 函数?

1 (共1页)
进入Programming版参与讨论
相关主题
#ifdef _MSC_VER 是什么意思啊?怎样include一个函数
问个两个.h文件互相include的问题purify和valgrind的比较
how to apply OOD to a code for both win and linux platform ?弱问C++一个问题 一直不解
关于c++的constructor的面试题c function 在 c里调用和C++调用结果不一样
Urgent question: AIX, C++11, Shared Object不用头文件,如何调用函数?C++
老哥使用的一项技术: extern定义全局变量[合集] 如果在自己的程序里调用external program (C++/Linux)
弱问c++里有没有NULL这个keyword?C++ questions
【请教】mpicc 和 mpiCC编译问题怎样清理不要的C代码
相关话题的讨论汇总
话题: c++话题: 函数话题: extern话题: parser话题: 调用