2013-03-15 5 views
0

Первоначально мой код был:Ошибка: #if [п] Защита ожидался идентификатор

#ifndef 2DO_H 
#define 2DO_H 
int ReadNumber(); 
void WriteAnswer(int Nsumber1, int Number2); 
#endif 

Однако я получаю сообщение об ошибке #if[n]def expected an identifier. Поэтому я играл с ним и понял, что моя ошибка была в 2DO_H. Когда я изменил мой код:

#ifndef DO_H 
#define DO_H 
int ReadNumber(); 
void WriteAnswer(int Nsumber1, int Number2); 
#endif 

Он работал в вышеуказанном случае, потому что я изменил 2DO_H к DO_H. Почему, когда у меня есть дополнительный номер перед идентификатором, я получаю сообщение об ошибке?

+2

Это тот же набор ограничений, что и имена переменных. – chris

ответ

3

Поскольку идентификаторы не могут начинаться с цифры. Это описано в 2.11 Identifiers текущего стандарта C++ 11, а именно в разделе Синтаксис:

identifier: 
    identifier-nondigit    # No digit allowed at front here. 
    identifier identifier-nondigit # Nor here. 
    identifier digit     # Nor here. 
+0

Но есть ли причина для этого? Почему в C++ это происходит? Должна быть причина для этого, потому что сейчас я не понимаю, почему цифры на переднем плане плохо написаны на языке программирования. –

+2

@ Justin, причина, почему это в C++, потому что он был в C (C++ первоначально был слоем поверх C). Причина, по которой это происходит в C, вероятно, связана с тем, что легче отличать числа и идентификаторы, если вы можете сказать разницу _early._ Это значительно облегчает задачу компиляторов (парсеров/лексеров), которые, когда C был молодые, не были такими умными :-) Подумайте об идентификаторе '3141592653589x', который вы не знаете, не является целым, пока не дойдете до последнего символа. – paxdiablo

+2

@ Justin и ситуация становится намного сложнее, когда также рассматривают литералы, такие как 0x3F, что на самом деле является числом. – JSQuareD

3
#ifndef 2DO_H 

Нах.

#ifndef TODO_H 

вместо этого. Идентификатор не может начинаться с цифры.