我正在尝试在C ++程序中包含一些C函数。 我得到一个包含数组作为参数的函数声明的问题。
$('select[name="position"]').append(
$('<option>', { value : value.position, text : value.position })
);
我收到以下错误
我使用Atollic 8.0(GCC和C -std = gnu11)
欢迎任何帮助
谢谢你
答案 0 :(得分:6)
extern "C"
不适合在cpp源代码中编译c。它只能在cpp源代码/头文件中使用C的ABI:修改,调用约定,异常处理......(感谢Ajay Brahmakshatriya)
通过修改,我想说出编译器/链接器使用的函数的内部唯一名称。 C mangling与c ++ mangling完全不同,因此不兼容。要在c ++中查找C函数,您必须向编译器/链接器说明函数已知的内部唯一名称。
extern "C"
只切换必须使用的ABI,包括用于创建内部唯一名称的修改以及如何调用函数,而不是切换编译模式。
如果您真的想编译c代码,则必须将代码放在c源文件中并单独编译。并使用extern "C"
在cpp环境中声明函数,以允许c ++代码使用它。 BUT 函数声明必须与c ++兼容,double Test( int nVar1, double f[nVar1] )
不是。
function.c,使用gcc -c
编译:
double Test( int nVar1, double f[] ) {
return f[nVar1-1];
}
function.h,兼容c和c ++:
#ifndef _FUNCTION_H
#define _FUNCTION_H
#ifdef __cplusplus
extern "C" {
#endif
double Test( int nVar1, double f[] );
#ifdef __cplusplus
}
#endif
#endif
main.cpp,使用g++ -c
编译:
#include "function.h"
int main() {
cout << "!!!Hello World!!!" << endl;
double f[2] = {1.0,2.0};
Test(2, f);
return 0;
}
最后,用g ++链接器连接所有内容:
g ++ function.o main.o -o my_program
参见此处的示例:
答案 1 :(得分:0)
问题在于数组大小。它不能是变量,应该是const。如果你需要传递一个可变大小的数组,那么只需将指针传递给它的第一个元素:
double Test( int nVar1, double * f) {
答案 2 :(得分:0)
你建议用g ++编译这样的C函数而不必重写这个遗留函数中包含的完整代码
#ifdef __cplusplus
extern "C" {
#endif
int ComputedF(int nPoints, int nFunc, double x[], double f[nPoints][nFunc], double df[nPoints][nFunc])
#ifdef __cplusplus
}
#endif
感谢您