$ 或 @ 都不是标准 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
十进制数字
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 实现允许这样的标识符。但是,一些目标机器不支持标识符中的美元符号,通常是因为目标汇编器不允许它们。