extern “C” causing an error “expected '(' before string constant”
本问题已经有最佳答案,请猛点这里访问。
文件1.C
1 2 3 4 | int add(int a, int b) { return (a+b); } |
文件2.CPP
1 2 3 4 5 6 | void main() { int c; c = add(1,2); } |
H1.H
1 2 3 4 5 6 | extern"C" { #include"stdio.h" int add(int a,int b); } |
案例1:当我在file1.c文件中包含h1.h时,gcc编译器会抛出一个错误"expected"("before string constant")。
案例2:当我在file2.cpp文件中包含h1.h时,编译工作成功
问题:
1)这是否意味着我不能在C中包含带有外部"C"函数的头文件??
2)是否可以在外部"C"中包含标题,如下所示
1 2 3 4 5 | extern"C" { #include"abc.h" #include"...h" } |
3)我能用外部的"C"把头函数文件中的C++函数定义放在C文件中吗?
例如
A.cpp(cpp文件)
1 2 3 4 | void test() { std::printf("this is a test function"); } |
A.H(头文件)
1 2 3 | extern"C" { void test(); } |
B_c.c(C文件)
1 2 3 4 5 6 | #include"a.h" void main() { test(); } |
这样写A.H:
1 2 3 4 5 6 7 8 9 10 11 | #pragma once #ifdef __cplusplus extern"C" { #endif int add(int a,int b); #ifdef __cplusplus } #endif |
通过这种方式,您可以声明多个函数——不需要在每个函数前面加上extern c。正如其他人提到的:ExtEnter C是C++的东西,所以当C编译器看到时,它需要"消失"。
由于外部"C"不被C编译器理解,所以需要创建一个头,它既可以包含在C文件中,也可以包含在C++文件中。
例如。
1 2 3 4 5 | #ifdef __cplusplus extern"C" int foo(int,int); #else int foo(int,int); #endif |