C编译器是否区分用户';s代码和库代码? #包括 //第2行:typedef unsigned int uint; //第3行:typedef unsigned int uint; int main(){ uint a; 返回0; }
鉴于上面的C代码,它已成功编译,因为uint在C编译器是否区分用户';s代码和库代码? #包括 //第2行:typedef unsigned int uint; //第3行:typedef unsigned int uint; int main(){ uint a; 返回0; },c,systypes.h,C,Systypes.h,鉴于上面的C代码,它已成功编译,因为uint在中定义。尽管它不是标准化的,但它是为了与Sys V兼容而添加的,在代码中有注释 取消注释上述代码的第二行仍然会导致编译成功。据我所知,不允许通过取消第二行和第三行的注释来重新定义一个类型,这将导致一个编译错误 为什么编译器足够聪明,知道uint是在标准库或用户代码中定义的?gcc和clang都提供一致的行为 编辑: 在这种情况下,链接不是游戏的一部分。该错误仅在编译时再现,即(-c选项) 增加行号以减少混淆 编辑: 取消注释上述代码的第二行仍然会导致
中定义。尽管它不是标准化的,但它是为了与Sys V兼容而添加的,在代码中有注释
取消注释上述代码的第二行仍然会导致编译成功。据我所知,不允许通过取消第二行和第三行的注释来重新定义一个类型,这将导致一个编译错误
为什么编译器足够聪明,知道uint是在标准库或用户代码中定义的?gcc和clang都提供一致的行为
编辑:
在这种情况下,链接不是游戏的一部分。该错误仅在编译时再现,即(-c选项)
增加行号以减少混淆
编辑:
取消注释上述代码的第二行仍然会导致编译成功。据我所知,不允许通过取消第二行和第三行的注释来重新定义一个类型,这将导致一个编译错误
我不知道我为什么写这个。显然,取消注释第2行和第3行不会导致gcc的编译错误。Clang给出了错误,因为默认编译选项更为严格,可以通过传递一些参数进行调整
描述是否允许使用多个typedef,这会变得非常复杂。无论如何,请尽量避免重复的typedef。标准库也是用户代码,通常由其他用户编写 取消注释上述代码的第二行仍然会导致编译成功。据我所知,不允许通过取消第二行和第三行的注释来重新定义一个类型,这将导致一个编译错误 在我的gcc上,它不是。(版本4.5.3) 为什么编译器足够聪明,知道uint是在标准库或用户代码中定义的?gcc和clang都提供一致的行为
编译器不知道用户代码和标准库中的代码之间的区别。虽然编译器可以区分标准库文件和用户代码,但我真的不认为有任何理由这样做。它所看到的只是文本数据,它可以lex/parse/codegen。重复声明在C中是完全有效的,因此,如果您在描述时取消注释这两行,您将不会看到任何错误,这与您所说的相反 为一个名称使用两个不同的声明将是一个错误
重复一个定义也是一个错误,但是typedef不是一个定义(尽管有
def
),它是一个声明。这并不能真正回答问题。@aniket My gcc有4.7.2版。而clang的版本是3.0。如果我取消注释第2行和第3行,他们都会抱怨。@AlbertNetymk您的编译选项是什么?我被您的问题弄糊涂了。链接器知道代码在哪里,以及它是在哪个部分生成的。编译器只看到您或其他人定义的类型。如果你能更详细地阐述你的问题,听起来就像你在描述一种帮助构建程序的语言,其组件基于特定的权限运行。我对艾达一无所知,但你的描述让我想起了我听说过的关于艾达的描述。同样,如果你能编辑你的原始帖子并进行更多解释,那会很有帮助。我的gcc不会因为2typedef unsigned int uint
而生气。现在,如果第二个尝试将其重新声明为其他内容,那么我将得到一个错误。您使用的是什么版本?类型只是编译器魔法。@cnicutar也不是我的:-)我正在编辑,我想我必须检查一下我的gcc对上述内容的说明
#include <sys/types.h>
//Line 2: typedef unsigned int uint;
//Line 3: typedef unsigned int uint;
int main() {
uint a;
return 0;
}