Понимание объявлений в той же области - PullRequest
0 голосов
/ 29 января 2019

Это языковой вопрос об ИСО С.

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

Ответы [ 2 ]

0 голосов
/ 29 января 2019

case 8

 enum {
     a
 };

 const unsigned char a; //UB, why?

Это не UB. Это семантическая ошибка.UB может произойти только во время выполнения.

дубликат идентификатора 'a'.Рассмотрим

int b = a;  //which a? 

case 7

enum{
    a
};

enum{
    a //UB, why?
};

Это не UB. Это семантическая ошибка.UB может произойти только во время выполнения.

дубликат идентификатора 'a'.Рассмотрим

int b = a;  //which a? 
0 голосов
/ 29 января 2019

Дело 7

Объясняется в пунктах 1, 4 и 5 пункта 6.7.2.3 (стр. 137) (выделено мое)

1 Aконкретный тип должен иметь свое содержимое, определенное не более одного раза.

4 Все объявления перечислимых типов структуры, объединения или , имеющих одинаковую область видимости и использующих один и тот же тег, объявляют одинаковыеtype. Независимо от того, есть ли тег или какие другие объявления типа находятся в той же единице перевода, тип является неполным [сноска 129)] до момента, когда сразу после закрывающей скобки списка определяется содержимое, и завершаетсязатем.

5 Два объявления структурного, объединенного или перечислимого типов, которые находятся в разных областях или используют разные теги, объявляют разные типы.Каждое объявление перечисляемого типа структуры, объединения или , которое не включает тег, объявляет отдельный тип .

Так что пример идентичных типов перечислений [ ifне для пункта 1 ] будет похоже на

enum TagNameA
{
    a
};
enum TagNameA
{
   a
};

Случай 8 Это объясняется в пункте 6.7.2.2 (стр. 136) (выделено мое)

Идентификаторы в списке перечислителя объявляются как константы типа int и могут появляться везде, где это разрешено [сноска: 127)]

...

[сноска 127)] Таким образом, идентификаторы констант перечисления, объявленные в одной и той же области видимости, должны отличаться друг от друга и от других идентификаторов, объявленных в обычных объявлениях.

, где в Случай 8

const unsigned char a;

является обычным декларатором для a, который не отличается от идентификатора константы перечисления a.

...