Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C的命名约定:结构和函数_C_Linux - Fatal编程技术网

C的命名约定:结构和函数

C的命名约定:结构和函数,c,linux,C,Linux,在探索sigaction.h标题中处理系统信号请求的功能时,我注意到返回int的结构和函数被命名为sigaction 尽管它在语义上似乎是正确的,但由于编译器应该能够在这两个定义之间进行推断,为什么sigaction的重复定义是有效的C语法?在C中,结构标记位于与其他名称不同的命名空间中。该结构称为struct-sigaction,而函数只是sigaction,编译器能够分离结构标记(以及联合和枚举),因为它们分别遵循关键字struct/联合/枚举(C11§6.2.3p1) 然后,根据§6.7p

在探索
sigaction.h
标题中处理系统信号请求的功能时,我注意到返回
int
的结构和函数被命名为
sigaction


尽管它在语义上似乎是正确的,但由于编译器应该能够在这两个定义之间进行推断,为什么
sigaction
的重复定义是有效的C语法?

在C中,结构标记位于与其他名称不同的命名空间中。该结构称为
struct-sigaction
,而函数只是
sigaction
,编译器能够分离结构标记(以及联合和枚举),因为它们分别遵循关键字
struct
/
联合
/
枚举
(C11§6.2.3p1)

然后,根据§6.7p3,声明必须在“相同名称空间”内唯一

由于结构标记和函数标识符(普通标识符)不在相同的名称空间中,“冲突”是可以的

在使用方面,您无法做到:

typedef struct _test {
    int a;
} test;

void test(void) {

}
编译器将通知您:

test.c:5:6: error: 'test' redeclared as different kind of symbol
 void test(void) {
      ^
test.c:3:3: note: previous declaration of 'test' was here
 } test;

这个问题被否决的主要原因是什么?我很想对否决票发表评论。否决票不是我的,但我认为对于C纯粹主义者来说,命名空间是一种异端…:-)@Frankie_C那么笑话就在他们身上,因为这是标准术语:p@Frankie_C:,第6.2.3节“标识符的名称空间”。