首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >预处理器内部的命名空间解析

预处理器内部的命名空间解析
EN

Stack Overflow用户
提问于 2022-10-10 10:47:14
回答 1查看 59关注 0票数 0

我在一个C可执行文件和一个大型的.h代码库之间共享了一个C++头。

代码语言:javascript
复制
#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
#endif

C源与排除很好地工作。

代码语言:javascript
复制
#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编译器下失败:

代码语言:javascript
复制
#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 { }的封闭式集团。

我当然可以将它更改为下面的内容,但是我仍然不知道为什么它不能工作。

代码语言:javascript
复制
#ifdef __cplusplus
    #define MY_OH_MY sizeof(my::my_t)
#else
    #define MY_OH_MY sizeof(my_t)
#endif
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-11 15:58:25

您不能在必须从C访问的C标识符中使用名称空间(因为它不是C语言的特性),实际上,您必须特别声明名称空间,以便编译器不会损坏名称。您只能在C++中使用它们,但是要小心地与C共享代码,您必须通知C++编译器哪些例程和哪些标识符可以从C中看到(编译器以不同的方式损坏名称以包括有关操作符定义、参数列表和重载以及名称空间的信息),从而使程序员完全无法理解标识符。

要查看一个示例,只需编写以下函数:

代码语言:javascript
复制
char *function1(char *parameter1, int parameter2)
{
    return 0;
}

并将其编译为C语言(用.c后缀命名文件)和使用C++语言(使用.cc作为文件后缀)。然后使用nm(1)查看编译器用于命名函数的名称。###As C代码(文件func.c):

代码语言:javascript
复制
$ make func.o
cc  -O2 -pipe -c func.c -o func.o
$ nm func.o
0000000000000000 T function1
$ _

###Now作为C++代码(在func.cc文件中):

代码语言:javascript
复制
$ make func.o
c++ -O2 -pipe -c func.cc -o func.o
$ nm func.o
0000000000000000 T _Z9function1Pci
$ _

_Z向编译器表示某些内容,9表示一个标识符9个字符长(function1),P表示指针,c表示chari (如果用于整数参数)。

如果您已经在C++中编译了它,但在extern "C" { }块中声明了它,那么名称将与第一个示例中的名称相同,但是您不应该能够用名称function1和不同的参数列表定义另一个函数,因为已经有一个名为function1的C函数

代码语言:javascript
复制
#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" */
#endif
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74013707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档