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

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[].<::>这里使用的是有向图.

C11:6.4.6(p3):

在语言的各个方面,六个令牌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)

  • @Radiodef; 发生了地震.我跑:).现在添加一个示例来演示差异. (3认同)

ric*_*ici 8

<:并且:>有向图 ; 它们分别相当于[].

我相信它们唯一真实的用途是创建混淆代码,例如你提供的代码,但它们是C99标准的一部分,旨在取代几乎永远存在于C中的更尴尬的三字母.

最初的目的是帮助程序员使用缺少某些标点符号的国家字符集.由于现在很少遇到不支持(至少)8位字符集的环境,允许像Ä这样的字符与[共存],问题大多没有实际意义.但仍然认为向后兼容性是必要的.

  • 没有.有向图和三字母不是为了支持混淆而设计的.由于这个原因,没有任何功能. (4认同)
  • @DavidHeffernan:我没有说他们打算支持混淆,只是说它们是用于那个目的的.它们旨在支持程序员(特别是在北欧国家),其国家字符集不包括某些标点符号,这个问题已不再适用. (3认同)
  • 仍然有程序员需要和使用这些功能.例如,北欧国家尚未沉入大海. (2认同)
  • @ChrisD:来自美国遗产科学词典 - "di-A前缀意味着"两个","两次"或"双重".它通常用于化学,如二氧化物,一种具有两个氧原子的化合物".因此有向图是两个字符的组合,用于表示另一个单个字符.类似地,C中有三字符,它们使用三个字符来表示另一个字符. (2认同)