Это языковой вопрос об ИСО С.
Я пытаюсь понять, как декларация определяется в Стандарте.Я пользуюсь 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 ?