在本教程中关于C语言中的套接字编程,我偶然发现了以下行:
bzero((char *) &serv;_addr, sizeof(serv_addr));
Run Code Online (Sandbox Code Playgroud)
由于某种原因,变量serv_addr被写为serv;_addr将其作为参考传递.它看起来像一个拼写错误(并且似乎也没有使用标准标志进行编译),但是这种用法在整个代码中是一致的 - 每当包含下划线的变量名称作为引用传递时,在下划线之前插入分号:
if (bind(sockfd, (struct sockaddr *) &serv;_addr,
sizeof(serv_addr)) < 0)
error("ERROR on binding");
[...]
newsockfd = accept(sockfd,
(struct sockaddr *) &cli;_addr, &clilen;);
[... and some more occurences]
Run Code Online (Sandbox Code Playgroud)
这种一致的用法(据我所知,gcc似乎同意)无效的语法让我想知道这种现象是否有一些解释.
以前有人见过这样的代码吗?有任何想法如何意外生成这样的代码?
这似乎与下划线(_)没有任何关系; 相反,它似乎是对标准化&符号(&)的失败尝试.&符号构造在HTML中用于表示使用(以及其他形式)的特殊字符&name;.例如<对于<,"对于"和&对&本身.
似乎原始源代码中的每个&符号后跟字母序列已被HTML中的&符号后跟字母和分号所取代(可能错误地认为这些是" 未终结的" "&符号 - 结构".源代码中的另一个示例演示了这一点:
(struct sockaddr *) &cli;_addr, &clilen;);
Run Code Online (Sandbox Code Playgroud)
这里既有&cli_addr和&clilen增加了分号,即使后者不包括下划线.
同时,或者在随后的"清理"中,&符号本身已被转换为&,如上面显示的行的HTML源代码所示:
(sockfd, (struct sockaddr *) &cli;_addr, &clilen;);
Run Code Online (Sandbox Code Playgroud)