2011-01-19 3 views
3

Я ищу, как я могу написать имя идентификаторы с символами, как [ ' "или #C универсальные имена макросов - НКУ -fextended-идентификаторы

Everytime, что я пытаюсь сделать это, я даю ошибку:.

error: macro names must be identifiers

Но узнав о GCC, я нашел этот вариант:

-fextended-identifiers

Но это, кажется, не работает, как я хотел, пожалуйста, кто-нибудь знает, как добиться этого

+2

Посмотрите здесь http://stackoverflow.com/questions/369495/what-are-the-valid-characters-for-macro-names – Elalfer

+4

Это кажется абсолютно ужасной идеей. Какова основная проблема, которую вы пытаетесь решить? Если вы можете объяснить, почему вы хотите это сделать, возможно, мы сможем помочь вам найти менее злобный способ добиться этого. –

+0

Я ищу, чтобы писать имена идентификаторов с такими символами только это, но используя только C prerpocessor, спасибо за ваши отзывы – drigoSkalWalker

ответ

0

Согласно this link, -fextended-identifiers поддерживает только идентификаторы UTF-8, поэтому это не поможет в вашем случае.

Итак, ответ: вы не можете использовать такие символы в макроопределениях.

+0

Да, но ['"является частью сортировки UTF-8, не так ли? – drigoSkalWalker

+0

Это не часть * дополнительных * символов, которые поставляются с UTF-8. Дело в том, что все ваши символы имеют смысл для компилятора, а символы UTF-8 не используются для каких-либо операторов, операторов или подобных компиляторов. – schnaader

+1

И этот FAQ указывает, что даже «родной» UTF-8 напрямую не поддерживается - поддерживаются только универсальные символы '\ uNNNN' или' \ UNNNNNNN'' - вам нужно запустить свой источник через фильтр, чтобы преобразовать 'native' расширенные символы к универсальной нотации. –

2

Идентификаторы не могут включать такие символы. Определяется таким образом в синтаксисе языка, идентификаторы - буквы, цифры или подчеркивание (и не должны начинаться с цифры, чтобы избежать двусмысленности с литерными номерами).

Если бы это было возможно, это противоречило бы компилятору C (который использует [для массивов) и синтаксис препроцессора C (который использует #). Расширение расширенных идентификаторов допускает использование символов, не запрещенных синтаксисом языка внутри идентификаторов (в основном, юникодными иностранными буквами и т. Д.).

Но если вы действительно хотите это сделать, ничто не запрещает вам предварительно обрабатывать ваши исходные файлы с помощью собственного «расширенного препроцессора макросов», практически создавая новый язык «C like». Это похоже на ужасную идею, но это не очень сложно сделать. Тогда вы увидите достаточно скоро сами, почему это не очень хорошая идея ...

+0

HAha да, это не очень хорошая идея, спасибо в любом случае. – drigoSkalWalker

+0

«Идентификаторы - это буквы, цифры или подчеркивание»: не верно в C99: http: // stackoverflow.ком/вопросы/34319000/какие-СОСТАВЛЯЮЩЕЙ-а-допустимый-C-идентификатор –

0

Даже если расширенная поддержка символов идентификатора был полностью включен, он не поможет вам получить символы, такие как:

[ ' " # 

для идентификаторов. Стандарт позволяет «универсальные имена символов» или «другие символы, определенные реализацией», быть частью идентификатора, но они не могут быть частью базового набора символов. Из базового набора символов только _, буквы и цифры могут быть частью имени идентификатора (6.4.2.1 Идентификаторы/Общие).

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