gpt4 book ai didi

c++ - 为什么 会阻止使用 "si_"作为某些变量名称的前缀?

转载 作者:IT老高 更新时间:2023-10-28 13:00:17 25 4
gpt4 key购买 nike

我一直在调试我的代码中出现的一个奇怪的编译错误,最后我发现我不能使用前缀 si_如果 <signal.h> 用于某些变量名称(任何类型)包括在内。

这是一个重现问题的非常简单的源代码示例:

#include <signal.h>

int main(void)
{
int si_value = 0;

return 0;
}

如果我尝试使用 GNU C 编译器来编译它 gcc ,我收到以下错误:

> gcc example.c
In file included from /usr/include/signal.h:57:0,
from example.c:2:
example.c: In function ‘main’:
example.c:6:9: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘.’ token
int si_value = 0;
^
example.c:6:9: error: expected expression before ‘.’ token

不过,如果我使用其他名称,例如 si_value2 ,错误没有出现。作为引用,我在 Ubuntu Mate 18.04.1 LTS 上使用 GCC v7.3.0。 g++ 观察到同样的问题。 .

我认为这种行为是由于 <signal.h> 中的某些宏定义造成的。标题,但经过简要介绍后,我似乎找不到任何真正相关的内容。

老实说,我可以通过使用另一个名称来解决它。但是,我担心的是:我以后如何才能优雅地避免此类问题?


更新:作为@F.X。建议使用 gcc -E example.c显示变量名已扩展(因此出现错误):

...
int
# 6 "example.c" 3 4
_sifields._rt.si_sigval
# 6 "example.c"
= 0;
...

最佳答案

<signal.h>实际上并没有阻止使用 si_作为变量的前缀。但是,POSIX 规范声明此前缀是保留的,以便允许它声明的 header 和库函数使用这些名称,而不必担心它们会与您自己的变量冲突。

所以这里发生的是 si_value在头文件中以某种方式定义,可能是宏或 typedef,并且您尝试使用相同的名称与此冲突。如果您使用了 si_vy1ghad563nvy43wd它可能会起作用,但理论上标题可以使用该名称(认为它不太可能与应用程序程序员使用的任何内容发生冲突)。

C 没有真正的命名空间,因此像这样的命名约定被用作简单的替代。

关于c++ - 为什么 <signal.h> 会阻止使用 "si_"作为某些变量名称的前缀?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53196962/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com