使用gcc中的数组参数编译extern“c”代码

时间:2017-10-19 08:23:28

标签: c++ c gcc

我正在尝试在C ++程序中包含一些C函数。 我得到一个包含数组作为参数的函数声明的问题。

$('select[name="position"]').append(
    $('<option>', { value : value.position, text : value.position })
);

我收到以下错误

  • 'f'未在此范围内声明
  • 'nVar1'未在此范围内声明
  • 在']'令牌
  • 之前使用函数体外部的参数

我使用Atollic 8.0(GCC和C -std = gnu11)

欢迎任何帮助

谢谢你

3 个答案:

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

感谢您