如何将`int main(int argc,char * argv< ::>)`作为main的有效签名?

时间:2015-04-26 06:50:42

标签: c++ c main

我在网站上看到int main(int argc, char* argv<::>)也可以用作main的签名。令人惊讶的是,以下计划:

int main(int argc, char* argv<::>)
{
  return 0;
}

编制输出GCC中的任何警告,以及铿锵声。它也用C ++编译。

那么,int main(int argc, char* argv<::>)如何成为main的有效签名?

2 个答案:

答案 0 :(得分:13)

char* argv<::>相当于char* argv[]。此处使用的<::>是有向图。

C11:6.4.6(p3):

  

在该语言的所有方面,六个令牌 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位字符集的环境,允许像Ä这样的字符与[共存],问题大多没有实际意义。但仍然认为向后兼容性是必要的。