Ни $
или @
являются частью набора символов стандартного языка C (C11 5.2.1 Наборы символов, пункт 3):
Как основной источник и основные наборы символов исполнения должны иметь следующие элементы: в 26 прописных букв латинского алфавит
A B C D E F G H I J K L M
N O P Q R S T U V W X Y Z
из 26 строчных букв латинского алфавита
a b c d e f g h i j k l m
n o p q r s t u v w x y z
в 10 десятичных цифры
0 1 2 3 4 5 6 7 8 9
следующие 29 графических символов
! " # % & ' () * + , - ./:
; <=> ? [ \ ]^_ { | } ~
символ пробела, и управляющие символы, представляющие горизонтальную вкладку, вкладка вертикальной , и подавать форму.
стандарт
C++ говорит о том же самом (2.2 Наборы символов, пункт 1):
основным источником набора символов состоит из 96 символов: символ пробела, управляющие символы, представляющие горизонтальная табуляция, вертикальная табуляция, форма подачи, а также новые линии, а также следующие графические символы 91:
a b c d e f g h i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
0 1 2 3 4 5 6 7 8 9
_ { } [ ] # () < > % : ; . ? * + -/^ & | ∼ ! = , \ " ’
Поэтому, если вы можете или не можете использовать их (вообще или даже для определенной цели), это зависит от вашей реализации.
В вашем случае это звучит, как вы, вероятно, с помощью GCC, который позволяет $
в идентификаторах как расширение, но не позволяет @
- вероятно, потому, что GCC также компилирует код Objective-C, где @
имеет особое значение.
От GCC documentation:
В GNU C, вы можете нормально использовать долларовые знаки в именах идентификаторов.Это связано с тем, что многие традиционные реализации C допускают такие идентификаторы. Однако знаки доллара в идентификаторах не поддерживаются на нескольких целевых компьютерах, как правило, потому что целевой ассемблер не позволяет их.
http://stackoverflow.com/questions/7926394/in-variable-name –
@ обычно для некоторых целей мета. – chris