c ++程序中的c文件

时间:2010-12-09 13:36:25

标签: c++ c mixing

#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(),操作它或将它交给下一个函数?

2 个答案:

答案 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