我在一个C可执行文件和一个大型的.h代码库之间共享了一个C++头。
#ifdef __cplusplus
namespace my {
#endif
typedef int my_t;
#define MY_OH_MY sizeof(my_t)
typedef my_t alias_t;
// plenty of other typedefs which push me to keep only
// these two bracing #ifdef __cplusplus ...
#ifdef __cplusplus
} // namespace
#endifC源与排除很好地工作。
#include "my.h"
int main(int argc, char ** argv)
{
my_t m = 1;
alias_t a = 2;
m += MY_OH_MY;
return 0;
}但是,CXX源代码在Gnu编译器下失败:
#include "my.h"
int main(int argc, char ** argv)
{
my::my_t m = 1;
my::alias_t a = 2;
m += MY_OH_MY;
return 0;
}my.h:7:25: error:‘my_t’没有在这个范围内声明;您的意思是‘my::my_t’?7 #define MY_OH_MY sizeof(my_t)
基本上因为(?)在预处理器的时候,名称空间还不是什么东西吗?我原以为,无论如何,它都会落入namespace { }的封闭式集团。
我当然可以将它更改为下面的内容,但是我仍然不知道为什么它不能工作。
#ifdef __cplusplus
#define MY_OH_MY sizeof(my::my_t)
#else
#define MY_OH_MY sizeof(my_t)
#endif发布于 2022-10-11 15:58:25
您不能在必须从C访问的C标识符中使用名称空间(因为它不是C语言的特性),实际上,您必须特别声明名称空间,以便编译器不会损坏名称。您只能在C++中使用它们,但是要小心地与C共享代码,您必须通知C++编译器哪些例程和哪些标识符可以从C中看到(编译器以不同的方式损坏名称以包括有关操作符定义、参数列表和重载以及名称空间的信息),从而使程序员完全无法理解标识符。
要查看一个示例,只需编写以下函数:
char *function1(char *parameter1, int parameter2)
{
return 0;
}并将其编译为C语言(用.c后缀命名文件)和使用C++语言(使用.cc作为文件后缀)。然后使用nm(1)查看编译器用于命名函数的名称。###As C代码(文件func.c):
$ make func.o
cc -O2 -pipe -c func.c -o func.o
$ nm func.o
0000000000000000 T function1
$ _###Now作为C++代码(在func.cc文件中):
$ make func.o
c++ -O2 -pipe -c func.cc -o func.o
$ nm func.o
0000000000000000 T _Z9function1Pci
$ __Z向编译器表示某些内容,9表示一个标识符9个字符长(function1),P表示指针,c表示char和i (如果用于整数参数)。
如果您已经在C++中编译了它,但在extern "C" { }块中声明了它,那么名称将与第一个示例中的名称相同,但是您不应该能够用名称function1和不同的参数列表定义另一个函数,因为已经有一个名为function1的C函数
#ifdef __cplusplus
extern "C" {
#endif
/* C++ functions that will be accessible from C code, or C function
* declarations that will be accessed from C++ code, depending on which
* source you include this code */
#ifdef __cplusplus
} /* extern "C" */
#endifhttps://stackoverflow.com/questions/74013707
复制相似问题