gpt4 book ai didi

c - Clang、GCC 接受相同功能的不同原型(prototype)

转载 作者:太空狗 更新时间:2023-10-29 16:01:33 29 4
gpt4 key购买 nike

我想报告一个针对 Clang 和 GCC 的错误,因为同一功能接受多个不兼容的原型(prototype)。

考虑以下示例:

$ clang -vUbuntu clang version 3.4-1ubuntu3 (tags/RELEASE_34/final) (based on LLVM 3.4)Target: x86_64-pc-linux-gnu…$ gcc -v…gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) $ cat t1.cint f(void);float f(void);$ gcc -c t1.ct1.c:3:7: error: conflicting types for ‘f’ float f(void);       ^t1.c:1:5: note: previous declaration of ‘f’ was here int f(void);     ^$ clang -c t1.ct1.c:3:7: error: conflicting types for 'f'float f(void);      ^t1.c:1:5: note: previous declaration is hereint f(void);    ^1 error generated.

Both GCC and Clang conform to what I am going to call the “expected behavior”.However, if f is set to return an enum or an unsigned int:

$ cat t2.c
typedef enum { m1 } t ;

t f();

unsigned int f();
$ gcc -c t2.c
$ clang -c t.c

f 的两个单独声明中的返回类型是简单的 enumunsigned int 时,GCC 和 Clang 都不会发出诊断信息.我想将此行为报告为错误。在 C11 标准中,条款 6.2.7:2 使两个程序 t1.c 和 t2.c 出现以上未定义行为:

6.2.7:2 All declarations that refer to the same object or function shall have compatible type; otherwise, the behavior is undefined.

但是,6.2.7:2 不在 Constraints 部分内,因此允许两个编译器对这些未定义的行为做他们想做的事,包括静默接受它们。是否有任何其他条款可以在像 t2.c 这样的程序中强制执行诊断,并且可以正确地将缺少诊断报告为编译器错误?或者我可能错误地期望枚举类型与 unsigned int 不兼容?

最佳答案

我在写上面问题的最后一句话时找到了答案:

t2.c 中没有未定义的行为。每个枚举类型都与编译器选择的一种普通整数类型兼容。在示例 t2.c 中,GCC 和 Clang 都选择了 unsigned intenum 兼容类型定义为 t .

6.7.2.2:4 Each enumerated type shall be compatible with char, a signed integer type, or an unsigned integer type. The choice of type is implementation-defined,128 but shall be capable of representing the values of all the members of the enumeration […]

128) An implementation may delay the choice of which integer type until all enumeration constants have been seen.

关于c - Clang、GCC 接受相同功能的不同原型(prototype),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27290702/

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