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节“标识符的名称空间”。