根据C++'03标准2.3/1:
在进行任何其他处理之前,每个出现的以下三个字符序列之一("三字符序列")被表1中指示的单个字符替换.
Run Code Online (Sandbox Code Playgroud)---------------------------------------------------------------------------- | trigraph | replacement | trigraph | replacement | trigraph | replacement | ---------------------------------------------------------------------------- | ??= | # | ??( | [ | ??< | { | | ??/ | \ | ??) | ] | ??> | } | | ??’ | ˆ | ??! | | | ??- | ˜ | ----------------------------------------------------------------------------
在现实生活中,这意味着代码printf( "What??!\n" );将导致打印,What|因为??!是一个被|字符替换的三字符序列.
我的问题是使用三字母的目的是什么?使用三字母有什么实际优势吗?
UPD:在答案中提到一些欧洲键盘没有所有标点字符,所以非美国程序员必须在日常生活中使用三字母组合?
UPD2:Visual Studio 2010默认情况下关闭了三字母支持.
我是一位非常有经验的 C 程序员,但最近我在大型机上遇到了一些具有局部变量的代码。这是在一个简单的 C 函数中声明此变量,然后strcpy将strcat两个字符串放入其中,然后尝试使用fopen.
char foo(|10|);
Run Code Online (Sandbox Code Playgroud)
这段代码很旧了。甚至可能是 K&R C 旧的。我想知道这是否是一些晦涩的编译器扩展或对没有 [] 或类似内容的键盘的适应。
有人知道这个声明是否“特殊”吗?
这是一个标准的 Z/OS 大型机。我不确定使用什么编译器。
我收到错误<:无法在g ++编译器上开始模板参数列表.码
template<typename T> class SomeClass;
class Class;
SomeClass<::Class>* cls;
Run Code Online (Sandbox Code Playgroud) 可能重复:
<:无法开始模板参数列表
你知道吗
int a<:10:>;
Run Code Online (Sandbox Code Playgroud)
相当于
int a[10];
Run Code Online (Sandbox Code Playgroud)
?
我正在编写一些代码,其中我有一个全局命名空间和一个受限制的命名空间,现在说NS1.我在我的全局命名空间中有一个名为Module的类,我在NS1中导入了一些其他库,它们也有一个名为Module的类.我试图创建我的模块的std :: list,即在NS1中的一个函数内部的:: Module,这样做,我得到了这个编译错误
std::list<::Module*> &myModule;
genllvm.cpp:60:11: error: ‘<::’ cannot begin a template-argument list
./genllvm.cpp:60:11: note: ‘<:’ is an alternate spelling for ‘[’. Insert whitespace between ‘<’ and ‘::’
./genllvm.cpp:60:11: note: (if you use ‘-fpermissive’ G++
Run Code Online (Sandbox Code Playgroud)
这个"<:"语法有什么意义?
在C++中,有[]和{}等替代令牌.
例如,以下代码编译:
%:include <stdio.h>
int main() <%
printf("Hello World!");
}
Run Code Online (Sandbox Code Playgroud)
我想了一会儿却想不出任何适用性,这有什么合理的理由吗?