“#include&lt”和#include之间的区别[关闭]

Posted

技术标签:

【中文标题】“#include&lt”和#include之间的区别[关闭]【英文标题】:Difference between "#include&lt" and #include" [closed] 【发布时间】:2020-01-14 16:17:47 【问题描述】:

我目前正在关注初始化 winsock 结构的教程,但它使用“#include&lt”而不是通常的“#include”语句。我想知道有什么区别以及是否有必要进行区分。我有很多 Unix 系统的 C 和 C++ 编码经验,但对 Windows 开发相对较新。教程中的完整代码如下:

#include<winsock2.h>

#pragma comment(lib,"ws2_32.lib") //Winsock Library

int main(int argc , char *argv[])

    WSADATA wsa;
    SOCKET s;
    struct sockaddr_in server;

    printf("\nInitialising Winsock...");
    if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
    
        printf("Failed. Error Code : %d",WSAGetLastError());
        return 1;
    

    printf("Initialised.\n");

    //Create a socket
    if((s = socket(AF_INET , SOCK_STREAM , 0 )) == INVALID_SOCKET)
    
        printf("Could not create socket : %d" , WSAGetLastError());
    

    printf("Socket created.\n");


    server.sin_addr.s_addr = inet_addr("74.125.235.20");
    server.sin_family = AF_INET;
    server.sin_port = htons( 80 );

    //Connect to remote server
    if (connect(s , (struct sockaddr *)&server , sizeof(server)) < 0)
    
        puts("connect error");
        return 1;
    

    puts("Connected");

    return 0;
```

UPDATE: This was apparently a result of an html typo in the original tutorial's website and should just be ```#include <stdio.h>``` 

【问题讨论】:

#include&amp;lt;winsock2.h&amp;gt; 不应使用 html 转义序列进行编译。你是在说#include &lt;someheader.h&gt;#include "someheader.h"之间的区别吗,后者应该有很多重复。 在这段代码中,HTML 脱轨时还有很多其他的指示符。以printf(&amp;quot;Initialised.\n&amp;quot;); 为例。 我认为我们需要 OP 对此作出回应。 编辑假定 HTML 转义问题是 OP 的问题,而不是原始代码的问题。到目前为止,这两个答案都假设相反。我们真的需要知道它是什么。 @smac89 请不要在编辑中完全改变问题的含义,除非 OP 告诉您您的解释是正确的。 【参考方案1】:

这只是不小心出现的糟糕的 HTML 格式。

正确的语法是:

#include <winsock2.h>

而且由于在 HTML 中 &amp;lt;&amp;gt; 符号经常被编码为 &amp;lt;&amp;gt;,编码意外地进入了您的示例代码,而不是正确的符号。

在代码的更下方,您将看到&amp;quot;&amp;amp;,它实际上应该是"&amp;

printf(&quot;Could not create socket : %d&quot; , WSAGetLastError());
printf("Could not create socket : %d", WSAGetLastError());

if (WSAStartup(MAKEWORD(2,2),&amp;wsa) != 0)
if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)

稍微相关的琐事:

C 有Trigraphs,这使得这段代码完全合法:

??=include <stdio.h>
int main(void)
??<
    char text??(??) = "Hello World";
    printf(text);
    return 0;
??>

【讨论】:

注: trigraphs 也在 C++ 中,直到 C++17 不要忘记二合字母,以防你想让你的代码看起来像&lt;%Classic ASP %&gt;【参考方案2】:

应该是#include &lt;winsock2.h&gt;

问题是&amp;lt;&amp;gt; 替换了&amp;lt;&amp;gt; 并且没有被替换回来。

&amp;lt;&lt; 的 HTML 转义,&amp;gt;&gt; 的 HTML 转义。

为了防止XSS,它可能被多次替换。

例如作者想使用 HTML 转义,但 XSS 保护逃脱了转义,您的浏览器只取消了一次转义。

另一种可能是 XSS 保护用 HTML 转义替换了作者的提交,而另一个 XSS 保护在您尝试加载页面时再次替换了它。

正如您在代码中看到的," (&amp;quot;) 和 &amp;amp; (&amp;amp;) 也是如此。

也有可能是教程创建时没有XSS保护,作者正确转义了特殊字符。之后,添加了 XSS 保护。这种 XSS 保护逃脱了转义并导致您的结果。

【讨论】:

以上是关于“#include&lt”和#include之间的区别[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

预处理器指令

转换特殊字符(UTF-8)

QueryFullProcessImageName 未在此范围内声明

#include <Windows.h> 是不好的做法吗?

带有 `-std=c++0x` 的 `#include <iostream>` 已损坏

C 编程指令 #include<stdio.h> printf