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