2009-02-12 2 views
12

У меня есть следующий код:пустота, VOID, C и C++

typedef void VOID; 
int f(void); 
int g(VOID); 

который компилирует только штрафом в C (с помощью GCC 4.3.2 на Fedora 10). Тот же самый код компилируется как C++ дает мне следующую ошибку:

void.c:3: error: ‘<anonymous>’ has incomplete type 
void.c:3: error: invalid use of ‘VOID’ 

Теперь, это то, что во внешней библиотеке, и я хотел бы, чтобы владелец, чтобы исправить эту проблему. Поэтому у меня есть вопрос - запрещает ли C++ стандарт этой конструкции? Не могли бы вы дать мне указатель/цитату? Единственное, что я могу вспомнить, это то, что объявление функции с (void), чтобы сигнализировать пустой список параметров, устарело в C++, но я не понимаю, почему typedefed VOID не работает.

+0

Для чего это необходимо, Visual C++ 2008 не имеет проблемы с этим кодом. –

+4

В windows.h обычно определяется '#define VOID void'. – Ismael

ответ

17

Да, насколько я знаю, второе объявление недействительно в C++ и C89, но оно действительно на C99.

из проекта C99, СК2 (6.7.5.3/10):

The special case of an unnamed parameter of type void as the only item in the list specifies that the function has no parameters.

Это явно идет о типе "пустота", а не ключевое слово.

от стандарта C++, 8.3.5/2:

If the parameter-declaration-clause is empty, the function takes no arguments. The parameter list (void) is equivalent to the empty parameter list.

Что это означает фактическое ключевое слово с «недействительным», а не общим типа «пустоты» также можно увидеть в одном из случаев, когда шаблон аргумента вычета выходит из строя (14.8.2/2):

  • Attempting to create a function type in which a parameter has a type of void.

Это кладется понятно другим, примечательны в докладе языкового вопроса один основного here и некоторые GCC багрепортов связан с другими ответами.


Напомним, что ваш GCC прав, но ранее версии GCC были неправильными. Таким образом, этот код мог быть успешно скомпилирован ранее. Вы должны исправить свой код, чтобы он использовал «void» для обеих функций, затем он будет компилироваться также с другими компиляторами (callau также отклоняет второе объявление с помощью этого «VOID»).

+3

Означает ли это, что он действителен в C++ 11? –

+1

[n4296] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf) формулировки очень похожи на C99: * Список параметров, состоящий из одного неназванного параметра не зависящего ** типа void ** равен , эквивалентный пустому списку параметров *. Означает ли это, что второе объявление действительно в соответствии с n4296 (и, возможно, C++ 11)? – Nawaz

+1

@ Наваз да, это –

0

Я просто поместил ваш код в .cpp-файл и скомпилирован без проблем в VS2005, SUSE, Redhat и Solaris, поэтому, я думаю, ваша конкретная версия gcc не одобряет это. Gal

18

gcc ошибки . Изменить: поскольку это было недостаточно ясно, я имел в виду, что gcc 4.3.2 скомпилировал его из-за ошибок. См. #32364 и #9278.

+3

«gcc bugs» не ответчик –

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

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