0
#include <iostream>
#include <string>
#include <vector>

extern "C"{
#include "sql.c"
}

class ReportsSync{

    public:
        string getQuery();                     
        bool testQuery(string);        
};

如果我有一个像tis这样的cpp文件,而不是像这样的.h文件,我可以像往常一样调用sql.c中定义的函数,就像我调用c++函数一样?例如:如果 sql.c 有一个名为 foo 的函数,它返回在 sql.c 本身中定义的数据类型,我可以在 testQuery() 中使用返回的数据类型,对其进行操作或将其提供给下一个函数吗?

4

2 回答 2

2

对于#include 指令,预处理器只进行文本替换。就像您将所有文本从 sql.c 复制到源文件一样。

所以是的,您可以调用 sql.c 中定义的函数。

我唯一知道需要注意的地方是您的 C 函数是否将函数指针作为参数来提供回调。你不应该在这样的回调中抛出异常,因为 C 不知道 C++ 异常。

然而,正如评论中已经指出的那样,#include 头文件更常见。因此,您可以在多个编译单元(.c 文件)中使用 sql.h 的功能。

于 2010-12-09T13:39:45.430 回答
0

只有一件事(太大而无法发表评论)。

添加extern "C" { <SOMETHING> }C++不会自动生成 SOMETHING 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 哟
$ g++ 哟 -pedantic -xc++ c++c.src
$ ./a.out
'a' 的常规大小为 1
extern "C" sizeof 'a' 为 1
普通的旧 C sizeof 'a' 是 4
于 2010-12-09T15:17:01.623 回答