这是关于ISO C的语言律师问题。
我试图了解标准中声明的定义。我使用N1570。考虑以下情况:
案例1。
int a;
extern int a; //compatible types, external linkage, well-defined behavior
案例2。
extern int a;
int a; //well-defined behavior, external linkage, well-defined behavior
案例3。
int a;
static int a; //6.2.2/6.9.2UB, linkage-disagreement
案例4。
static int a;
extern int a; //6̶.̶2̶.̶2̶/̶6̶.̶9̶.̶2̶ ̶U̶B̶,̶ ̶l̶i̶n̶k̶a̶g̶e̶-̶d̶i̶s̶a̶g̶r̶e̶e̶m̶e̶n̶t̶
//as @EricPostpischil mentioned in the comment
//it is well-defined in 6.2.2
案例5。
int a;
long a; //6.7.2 UB incompatible types
案例6。
int a;
const int a; //6.7.2/6.7.3 incompatible types, different qualifiers
案例7。
enum{
a
};
enum{
a //UB, why?
};
案例8。
enum {
a
};
const unsigned char a; //UB, why?
情况1-4
该解释在标准中清晰明确。
6.2.2(p7)
:
如果在翻译单元中,具有内部和外部链接的同一标识符出现,则行为未定义。
案例5
在以下各节中对此进行了解释6.2.7(p1)
:
如果在翻译单元中,具有内部和外部链接的同一标识符出现,则行为未定义。
和6.7(p4)
:
同一范围内引用相同对象或函数的所有声明应指定兼容类型。
案例6
它的解释是6.7.3(p10)
:
为了使两个合格的类型兼容,两个都应具有相同的合格类型的兼容类型
案例7-8。
不清楚 我没有在标准中找到任何与之相关的正式参考。6.2.7(p1)
状态:
对于两个枚举,相应的成员应具有相同的值。
案例7满足该要求。
所以我没看到任何问题
我没有发现与情况8明确相关的任何内容,因此,如果在标准中未对其进行定义,则应将其为UB。
您能否在案例7和案例8的标准中找到解释?
案例7
6.7.2.3第1、4和5段(第137页)对此进行了解释(强调是我的)
1特定类型最多应定义一次其内容。
4具有相同范围和使用相同标记的所有结构,联合或枚举类型的声明都声明相同的类型。无论在同一翻译单元中是否有标签或其他类型的声明,该类型都是不完整的(脚注129),直到紧接在定义内容的列表的大括号之后,然后再完成。
5结构,联合或枚举类型的两个声明在不同范围内或使用不同的标记声明了不同的类型。结构,联合或枚举类型的每个不包含标签的声明都声明一个不同的类型。
因此,一个相同类型的枚举的示例[如果不是第1款]
enum TagNameA
{
a
};
enum TagNameA
{
a
};
情况8 6.7.2.2第3段(第136页)对此进行了解释(强调是我的)
枚举器列表中的标识符被声明为具有int类型的常量,并且可以在允许的任何位置出现[脚注:127)]
...
[脚注127]因此,在同一范围内声明的枚举常量的标识符应彼此不同,并且应与普通声明符中声明的其他标识符不同。
在情况8中
const unsigned char a;
是一个普通的声明器,a
因为它与枚举常量标识符没有区别。 a
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句