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