2013-12-12 1 views
3

Я скомпилировал эти коды в MSVC:определение типа в скобках

int a=sizeof(struct{char c;}); 

и

int b=((struct{char c;} *)0,0); 

и

printf("%p",(struct{char c;} *)0); 

Как коды C, они могут передать компиляции с предупреждением (Предупреждение c4116: определение безымянного типа в круглых скобках. Если вы укажете имя, это «предупреждение c4115: «Что бы ни было»: определение имени в круглых скобках »);
Как коды C++, они скомпилированы с кучей ошибок.

Мои вопросы:
1. В C, являются ли определения типов в круглых скобках действительными? Почему я получаю это предупреждение?
2. В C++ существуют определения типов в круглых скобках?

EDIT:
3. Почему?

+0

Я уверен, что это недопустимо в C++ и возможно допустимо в C (или, может быть, просто в расширении). – chris

+0

В чем смысл этого вопроса? Где это было бы полезно? – RedX

+0

@ user1920482, Это совсем не хороший тест. Рассмотрим 'int &r = 5;', который может компилироваться с помощью MSVC и известен как расширение компилятора зла. Или рассмотрите VLA, которые, как и на C++ 11, все еще не являются стандартными, но многие используют их. – chris

ответ

2

В C:

sizeof(struct{char c;}) 

и

sizeof((struct{char c;} *)0,0) 

являются допустимыми выражениями. Реализация может бесплатно выпустить дополнительные информационные диагностические сообщения для действительного кода C.

+1

Ель ясно, но что означает 0,0? –

+0

@VX это выражение, сформированное с помощью оператора с запятой C – ouah

+0

@VX. Оператор запятой имеет самый низкий приоритет, поэтому он намного больше 0,0, но в этом случае он просто просто «0», сохраните дополнительную диагностику на первая часть. – chris

4

В C sizeof может применяться к любому типу, который не является неполным типом (6.5.3.4p1); a struct-or-union-specifier, который содержит список объявлений структуры (6.7.2.1p1), является спецификатором типа и, таким образом, с типом. Предупреждение MSVC существует по двум причинам: во-первых, потому что некоторые старые компиляторы (или компилятор C++, используемые как компилятор C) могут не поддерживать это использование, а во-вторых, потому что это необычно и может быть не так, как вы планировали.

В C++ sizeof может применяться к идентификатору ; класса спецификатор является типа спецификатор и, таким образом типа ID, но класс спецификатор, который определяет класс (или перечисление спецификатор, который определяет перечисление) может появиться только в объявлении класса или using декларация (7.1.6p3). Вероятно, потому, что классы C++ могут иметь связь и позволять им появляться в общих выражениях (а не только в определениях), усложнят это.

 Смежные вопросы

  • Нет связанных вопросов^_^