我在某个网站看到过,int main(int argc, char* argv<::>)
也可以作为main
函数的签名。令人惊讶的是,下面的程序:
int main(int argc, char* argv<::>)
{
return 0;
}
该代码在GCC和Clang编译器下能够无警告地编译通过。同时,它也可以在C++中进行编译。
那么,为什么int main(int argc, char* argv<::>)
是main
函数的有效签名呢?
我在某个网站看到过,int main(int argc, char* argv<::>)
也可以作为main
函数的签名。令人惊讶的是,下面的程序:
int main(int argc, char* argv<::>)
{
return 0;
}
该代码在GCC和Clang编译器下能够无警告地编译通过。同时,它也可以在C++中进行编译。
那么,为什么int main(int argc, char* argv<::>)
是main
函数的有效签名呢?
char* argv<::>
相当于char* argv[]
。这里使用的<:
和:>
是双字母符号。
在语言的所有方面中,六个标记79)
<: :> <% %> %: %:%:
分别与六个记号的行为相同
[ ] { } # ##
除了拼写之外。80)
%: define stringize(a) printf("Digraph \"%s\" retains its spelling in case of stringization.\n", %:a)
调用上述宏
stringize( %:);
将打印
Digraph "%:" retains its spelling in case of stringization.
#
吗?有什么区别吗? - Radiodef<:
和:>
是双字符,它们分别相当于[
和]
。
我认为它们唯一的现实应用是创建混淆代码,就像您展示的代码一样,但它们是C99标准的一部分,旨在替代自C语言诞生以来一直存在的更加令人尴尬的三字符。
最初的目的是帮助使用缺少某些标点符号的国家字符集的程序员。由于现在很少遇到不支持(至少)8位字符集(例如允许像Ä这样的字符与[并存)的环境,因此这个问题基本上无关紧要了。但是向后兼容性仍然被认为是必要的。
<:
和:>
是代表[
和]
的双字符符号。请参阅http://en.wikipedia.org/wiki/Digraphs_and_trigraphs#C。 - Michael Burr