Netinet/ip. h的VSCode C/C++智能感知问题

8yparm6h  于 2022-12-17  发布在  Vscode
关注(0)|答案(1)|浏览(367)

当尝试使用struct ip时,VSCode报告incomplete type is not allowed错误。我知道这是intellisense的问题,因为我的程序使用gcc monitor.c -o monitor -lnet编译得很好,所以没有实际的错误,但intellisense似乎不同意。
下面是获取错误的最小代码:

#include <netinet/ip.h>
#include <stdlib.h>

int main()
{
    struct ip * my_ip = (struct ip *) malloc(sizeof(struct ip));
}

我尝试将/usr/include/**添加到c_cpp_propertied.json文件。
直接查看ip.h文件,我可以看到struct定义“隐藏”在#ifdef __USE_MISC中,所以我将其添加到c_cpp_propertied.json的defines部分,但没有成功。
我的想法很新鲜,而且我还没能找到任何与这个问题相关的东西。反正也没什么帮助。

o7jaxewo

o7jaxewo1#

直接查看ip. h文件,我可以看到struct定义“隐藏”在#ifdef __USE_MISC中,所以我将其添加到c_cpp_propertied. json的defines部分,但没有成功。
根据这一点,您可以尝试在示例中执行以下操作:

#ifndef __USE_MISC
#define __USE_MISC
#endif // __USE_MISC

#include <netinet/ip.h>
#include <stdlib.h>

int main()
{
    struct ip * my_ip = (struct ip *) malloc(sizeof(struct ip));
}

说明:你提到struct隐藏在#ifdef __USE_MISC预处理器条件中。这意味着只有当在你的代码中某个地方在这个文件之前存在#define __USE_MISC定义,或者这个定义是通过编译器标志传递的,它才是可见的。看起来VSCode C/C++ Intellisense没有这样做,而gcc做了
另外,请看一下这个宏是什么意思,它的用途是什么:link
P.P.S.经过进一步调查发现OP在其编译器标志/源文件中没有定义_DEFAULT_SOURCE定义。因此,实际答案是在include之前添加以下代码片段(或添加到编译器标志或IDE设置中):

#ifndef _DEFAULT_SOURCE
#define _DEFAULT_SOURCE
#endif // _DEFAULT_SOURCE

#include <netinet/ip.h>

// ...

相关问题