C++ 未定义的C/C++;符号作为运算符

C++ 未定义的C/C++;符号作为运算符,c++,c,syntax,operators,symbols,C++,C,Syntax,Operators,Symbols,我注意到字符/符号'`'和'@'在C/C++中没有用作运算符 有人知道其原因或历史原因吗 如果真的没有使用它,那么使用#define将这些符号定义为另一个运算符/语句是否安全 这可能是安全的,但几乎可以肯定这是一个非常糟糕的主意。由于@不是标准的运算符,因此阅读您的代码的任何其他人都必须在您使用@的任何地方查找它的定义。我们命名函数,而不仅仅是使用符号,以便阅读代码的人能够了解它的功能 另一方面,Objective-C使用@。不确定这是否与您的项目相关,但如果有人试图使用ObjC中的C代码,他们

我注意到字符/符号'`'和'@'在C/C++中没有用作运算符

  • 有人知道其原因或历史原因吗
  • 如果真的没有使用它,那么使用#define将这些符号定义为另一个运算符/语句是否安全

  • 这可能是安全的,但几乎可以肯定这是一个非常糟糕的主意。由于
    @
    不是标准的运算符,因此阅读您的代码的任何其他人都必须在您使用
    @
    的任何地方查找它的定义。我们命名函数,而不仅仅是使用符号,以便阅读代码的人能够了解它的功能

    另一方面,Objective-C使用
    @
    。不确定这是否与您的项目相关,但如果有人试图使用ObjC中的C代码,他们的所有代码都会因为您的
    #define
    而中断。通常,
    #define
    只接受宏名称中的有效标识符,因此您无法执行以下操作:

    #define @      at
    #define @(x)   [x]
    
    同样,后面的报价。您没有提到“$”,这在标识符中有时是允许的

    可能有一个特定于编译器的扩展来允许这种映射,但我不会使用它


    至于这种情况的历史原因,字符集的某些部分是为国家字符保留给国家实现的。这些保留部分包括引起问题的字符,标准C(因此标准C++)中的三角图和有向图功能分别于1989年和1994年添加到ISO C中,以提供解决问题的方法

    三合字母 在C89标准化过程中添加了三角图,以防止人们看到C代码中使用的字母字符(斯堪的纳维亚语)(改编自B Stroustrup“C++的设计和发展”,使用丹麦终端):

    使用有向图(和三角图)的示例:

    %:包括
    %:包括
    int main(int argc,字符**argv)
    
    在签名和背面特别报价? 如果你查看上面的维基百科URL,你会发现“@”和“`”有时都会被国家字符替换,因此不是很好的标识符。不使用“@”的另一个原因是,在引入C时,“#”是默认的擦除字符,“@”是终端的kill(行擦除)字符。因此,您必须记住对它们进行转义。因为“#”只出现在行的开头,所以问题不大(使用“#”和“##”出现得越来越晚——再次标准化了),但是“@”会删除前面的所有输入。这是在“vi”之前的日子——“ed是标准的Unix编辑器”。

    关于C:

    #define
    d宏的名称是C标识符(§6.10)

    标识符可能由
    \u a-zA-Z0-9
    (§6.4.2.1)组成。其他任何内容都是实现定义的。如果在宏名称中使用
    @
    ,它可能在某些编译器上工作(尽管我会感到惊讶),但它将不可移植


    <>我不知道C++的情况是什么。< /P>注意到<代码> @ /COD>在Objtovi-C(C的超集)中被广泛使用。我严格地要求C或C++不是另一个派生或超集,但是无论如何,我可以用“@符号右”防止我的代码使用Objto-C链接,……@ uray:不,Objc用户可以使用一个自制的头文件。当然,你可以防止你的代码在Objto-C中使用,但是它们不会是VALI。每一个有效的C程序都是一个有效的Objto-C程序。基本上,在这个上下文中,C和C++与标准标识符相同。很好地捕获了代码> $< /代码>,例如,它允许在大多数平台上由GCC标识符。
    #include <stdio.h>
    int main(int argc, char **argvÆÅ)
    æ
        if (argc < 1 øø *argvÆ1Å == 'Ø0') return 0;
        printf("Hello, %sØn", argvÆ1Å);
    å
    
    #include <stdio.h>
    int main(int argc, char **argv[])
    {
         if (argc < 1 || argv[1] == '\0') return 0;
         printf("Hello, %s\n", argv[1]);
    }
    
    ??=include <stdio.h>
    int main(int argc, char **argv??(??))
    ??<
        if (argc < 1 ??!??! *argv??(1??) == '??/0') return 0;
        printf("Hello, %s??/n", argv??(1??));
    ??>
    
    Trigraph      Equivalent to
    ??/           \      backslash
    ??<           {      open brace
    ??>           }      close brace
    ??(           [      open square bracket
    ??)           ]      close square bracket
    ??=           #      hash (pound in American, but a pound is £ in English)
    ??'           ^      caret
    ??!           |      pipe
    ??-           ~      tilde
    
    Digraph       Equivalent to
    <:            [
    :>            ]
    <%            {
    %>            }
    %:            #
    %:%:          ##
    
    %:include <stdio.h>
    %:include <iso646.h>
    int main(int argc, char **argv<::>)
    <%
        if (argc < 1 or *argv<:1:> == '??/0') return 0;
        printf("Hello, %s??/n", argv<:1:>);
    %>