我在网站上看到int main(int argc, char* argv<::>)
也可以用作main
的签名。令人惊讶的是,以下计划:
int main(int argc, char* argv<::>)
{
return 0;
}
编制输出GCC中的任何警告,以及铿锵声。它也用C ++编译。
那么,int main(int argc, char* argv<::>)
如何成为main
的有效签名?
答案 0 :(得分:13)
char* argv<::>
相当于char* argv[]
。此处使用的<:
和:>
是有向图。
在该语言的所有方面,六个令牌 79)
<: :> <% %> %: %:%:
分别表现为与六个令牌相同
[ ] { } # ##
除了他们的拼写。 80)
脚注:
79)这些代币有时被称为“有向图”
80)因此[
和<:
在''stringized''时表现不同(见6.10.3.2),但可以自由互换。
一个例子:
%: define stringize(a) printf("Digraph \"%s\" retains its spelling in case of stringization.\n", %:a)
调用上面的宏
stringize( %:);
将打印
Digraph "%:" retains its spelling in case of stringization.
答案 1 :(得分:8)
<:
和:>
是有向图;它们分别相当于[
和]
。
我相信他们唯一真实的用途是创建混淆代码,例如你提供的代码,但它们是C99标准的一部分,旨在取代更为尴尬的 trigraphs 几乎永远在C中。
最初的目的是帮助程序员使用缺少某些标点符号的国家字符集。由于现在很少遇到不支持(至少)8位字符集的环境,允许像Ä这样的字符与[共存],问题大多没有实际意义。但仍然认为向后兼容性是必要的。