Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.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编译器是否区分用户';s代码和库代码? #包括 //第2行:typedef unsigned int uint; //第3行:typedef unsigned int uint; int main(){ uint a; 返回0; }_C_Systypes.h - Fatal编程技术网

C编译器是否区分用户';s代码和库代码? #包括 //第2行:typedef unsigned int uint; //第3行:typedef unsigned int uint; int main(){ uint a; 返回0; }

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选项) 增加行号以减少混淆 编辑: 取消注释上述代码的第二行仍然会导致

鉴于上面的C代码,它已成功编译,因为uint在
中定义。尽管它不是标准化的,但它是为了与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不会因为2
typedef 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;
}