В чем разница между встроенным void и VOID от typedef void VOID?

Случайно у меня возникла следующая проблема:

typedef void VOID;

class Cls1
{
public:
  VOID Clear(VOID);
};

И компилятор (g ++ 4.6.1) сообщил

ошибка: 'анонимный' имеет неполный тип ошибка: 'недопустимое использование' VOID {aka void} '

Есть ли особая причина, по которой «недействительный» отличается от «недействителен»?


person xis    schedule 21.05.2012    source источник
comment
C ++ faq содержит хорошие отзывы о использование f(void);.   -  person Jesse Good    schedule 22.05.2012
comment
объявление списка параметров void с помощью typedef нестандартно   -  person Gene Bushuyev    schedule 22.05.2012
comment
Этот вопрос я вижу много раз. Попробуйте Google, прежде чем задать вопрос.   -  person Xearinox    schedule 22.05.2012


Ответы (2)


Хорошо, компилятор clang выдает более читаемую ошибку:

test.cpp: 14: 20: ошибка: пустой список параметров, определенный с typedef 'void', недопустим в C ++ void Clear (VOID);

person xis    schedule 21.05.2012

Нет ничего особенного.

В C ++ пустые списки параметров пусты, а не «недействительны».

person Edward Strange    schedule 21.05.2012
comment
Я предпочитаю явно добавлять void для пустых списков параметров, так как в пустых списках параметров C без void предполагается, что вы можете передавать произвольные параметры. - person xis; 22.05.2012
comment
@ xis19: вам нужно решить, пишете ли вы код C или C ++. В C ++ пустой список параметров идиоматичен. - person jalf; 22.05.2012
comment
@ xis19 - ОК. vOv Мне нравится называть все свои переменные C ++ символом «$» в начале, потому что именно так это делается в Perl. - person Edward Strange; 22.05.2012
comment
@ xis19, C не имеет функций-членов, следование правилам C для функций-членов не имеет смысла. В C ++ f(void) считается мерзостью, но допускается для совместимости с C. То же самое с typedef настолько отвратительно, что это даже не разрешено. - person Jonathan Wakely; 22.05.2012