在 gcc 中使用数组参数编译外部"c"代码

Compiling extern "c" code with array parameters in gcc

本文关键字:外部 编译 代码 参数 数组 gcc      更新时间:2023-10-16

我正试图在C++程序中包含一些C函数。我在函数声明中遇到了一些问题,该声明包含数组作为参数。

extern "C" {
double Test( int nVar1, double f[nVar1] ) {
return f[nVar1-1];
}
}
int main() {
cout << "!!!Hello World!!!" << endl; 
double f[2] = {1.0,2.0};
Test(2, f);
return 0;
}

我得到以下错误

  • 'f'未在此范围内声明
  • "nVar1"未在此作用域中声明
  • 在']'标记之前在函数体外部使用参数

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

任何帮助都欢迎

谢谢

extern "C"不用于在cpp源中编译c。它只是在cpp源/头中使用C的ABI:mangling、调用约定、异常处理。。。(感谢Ajay Brahmakshatriya)

通过篡改,我想说编译器/链接器使用的函数的内部唯一名称。C篡改与C++篡改确实不同,因此不兼容。要在C++中找到C函数,必须向编译器/链接器说明该函数的内部唯一名称。

extern "C"只切换必须使用的ABI,包括用于创建内部唯一名称的mangling和必须如何调用函数,而不是切换编译模式。

如果你真的想编译c代码,你必须把你的代码放在c源文件中,然后单独编译。并使用extern "C"在cpp环境中声明函数,以允许c++代码使用它。函数的BUT声明必须与c++兼容,而double Test( int nVar1, double f[nVar1] )则不兼容。

函数.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++函数.omain.o-o my_program

请参阅此处的示例:

  • C++源代码、编译C、编译C++和链接

  • C源

问题出在数组大小上。它不能是变量,应该是常量。如果您需要传递一个可变大小的数组,那么只需将指针传递到它的第一个元素:double Test( int nVar1, double * f) {