#include <iostream>
#include <string>
#include <vector>
extern "C"{
#include "sql.c"
}
class ReportsSync{
public:
string getQuery();
bool testQuery(string);
};
如果我有像tis这样的cpp文件,而不是像这样的.h文件,wud我能像往常一样调用sql.c中的函数定义,就像我调用c ++函数一样? 例如:如果sql.c有一个名为foo的函数,它返回sql.c本身定义的数据类型,我可以使用返回的数据类型,也许是testQuery(),操作它或将它交给下一个函数?
答案 0 :(得分:2)
对于#include指令,预处理器只进行文本替换。就像将所有文本从sql.c复制到源文件一样。
所以是的,你可以调用sql.c中定义的函数。
我唯一知道需要注意的地方是你的C函数是否将函数指针作为参数来提供回调。你不应该在这样的回调中抛出异常,因为C不知道C ++异常。
然而,正如评论中已经指出的那样,#include头文件更常见。因此,您可以在多个编译单元(.c文件)中使用sql.h的函数。
答案 1 :(得分:0)
只有一件事(太大而无法发表评论)。
将extern "C" { <SOMETHING> }
添加到C++
来源不会自动生成有趣的C
。它仍为C++
,但该SOMETHING的界面遵循C
规则而非C++
规则。
#ifndef __cplusplus
/* plain old C */
int y(void) {
return sizeof 'a';
}
#else
/* C++ */
#include <iostream>
extern "C" {
int y(); /* y is defined above, compiled with a C compiler */
int x() {
return sizeof 'a';
}
}
int main() {
std::cout << "regular sizeof 'a' is " << sizeof 'a' << std::endl;
std::cout << "extern \"C\" sizeof 'a' is " << x() << std::endl;
std::cout << "plain old C sizeof 'a' is " << y() << std::endl;
}
#endif
上面程序的编译保存为“c ++ c.src”和测试运行
$ gcc -std=c89 -pedantic -c -xc c++c.src -o y.o $ g++ y.o -pedantic -xc++ c++c.src $ ./a.out regular sizeof 'a' is 1 extern "C" sizeof 'a' is 1 plain old C sizeof 'a' is 4