Является ли с ++ свободным языком? - PullRequest
2 голосов
/ 27 января 2011
 #define PR ( A, B )  cout << ( A ) << ( B ) << endl ;

- ошибка -> A не была объявлена ​​в области
- ошибка -> B не была объявлена ​​в области
- ошибка -> ожидаемая "," до "cout"

Я думал, что C ++ - это язык без пробелов, но когда я пишу код выше, я вижу некоторые ошибки.Я все еще думаю: «Моя консоль не работает должным образом или библиотека?».

Если я не ошибаюсь, как кто-то может сказать «C ++ - это свободный от пробелов язык» ?

Ответы [ 5 ]

10 голосов
/ 27 января 2011

Есть множество исключений, когда пробел имеет значение; Это одна из них. С пробелом после PR как препроцессор должен знать, является ли (A,B) частью макроса или его аргументами? Это не так, и просто предполагает, что везде, где он видит PR, он должен заменить ( A, B ) cout << ( A ) << ( B ) << endl ;.

Еще одно место, где пробельные символы имеют значение, - это вложенные аргументы шаблона, например ::100100

std::vector<std::vector<int> >

Этот последний пробел является обязательным, в противном случае компилятор предполагает, что это оператор >>. (Хотя я считаю, что это решено в C ++ 0x).

Еще один пример:

a + +b;

Пробел между двумя символами + является обязательным по очевидным причинам.

6 голосов
/ 27 января 2011

Между именем макрофункции и круглыми скобками, начинающими список аргументов, не должно быть пробела.

#define PR(A, B) cout << ( A ) << ( B ) << endl

Пробелы в форме новой строки также имеют значение, поскольку оператор #define заканчиваетсякогда препроцессор переходит на новую строку.

Обратите внимание, что обычно ставить точку с запятой в конце определений макрофункций плохо, поэтому они выглядят запутанными, если использовать точку с запятой ниже.

1 голос
/ 27 января 2011

A #define - это не c ++, это препроцессор. Правила c ++ не совпадают с правилами препроцессора.

Чтобы указать макрос, между именем и круглыми скобками не должно быть пробела.

#define PR(A, B)  cout << ( A ) << ( B ) << endl;
0 голосов
/ 27 января 2011

Вы можете думать о препроцессоре c ++ как о инструкции препроцессору (части компилятора), а не как о части «пространства c ++». Так что правила действительно разные, хотя многие ссылки разделяются между двумя пробелами»..

0 голосов
/ 27 января 2011

Вы просите защитить претензию, которую я никогда не слышал, чтобы кто-то потрудился озвучить ...?

Этап препроцессора не следует тем же правилам, что и последующие этапы лексического процесса и т.Есть и другие причуды: необходимость пробела между > закрывающими шаблонами, комментарии, разделенные символом новой строки, строковые литералы не могут вставлять фактические символы новой строки (в отличие от escape-последовательностей для них), пробел внутри символьных и строковых литералов влияет на них ....

Тем не менее, есть лот свободы для отступа и разграничения строк по-разному, в отличие, скажем, от Python.

...