在 gcc 中使用数组参数编译外部"c"代码
Compiling extern "c" code with array parameters in gcc
我正试图在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) {
相关文章:
- 使用外部SDK工具链文件在VisualStudio上生成项目编译错误
- 尝试从 XamlApplication 编译 C++/WinRT 空白应用程序时,我收到未解析的外部符号 winrt_make_*
- 良好做法:如何定义用于编译的外部库的路径
- 交叉编译时包括外部库
- C++ 为什么在定义的编译和链接之前引用外部实例的程序
- 我正在为学校开发一个小班模板实验室,我的代码无法编译,它给了我一个未解析的外部符号
- 如何使用Makevars链接到RCPP中已经编译的外部共享库
- C++编译错误LNK2019:未解决的外部符号错误
- 错误 LNK 2019 在 c++ 中编译期间未解析的外部生成错误
- 编译示例 Cinder 项目时存在大量未解决的外部问题
- 是否可以编译具有在编译时无法解析的外部依赖项的静态库?
- QT-不能使用外部库进行交叉编译
- 编译轨道样品时的C 错误-LNK2019未解决的外部符号
- 在Linux上编译外部库
- 使用外部库进行编译
- 在 gcc 中使用数组参数编译外部"c"代码
- 我是否可以将外部库(OPENCV,MLPACK)编译到MCU上
- QtCreator - 编译问题 - 外部源文件
- r语言 - 使用外部 C 库在 Rcpp 中编译C++
- 奇异的未解决的外部编译DLL