当我在VS Code上编写C代码时,当项目正常编译时,IntelliSense无法检测到标准库中声明的函数.

详细信息:

flockfile函数在stdio.h中被声明为void flockfile (FILE *__stream),但IntelliSense错误地对待该函数.

enter image description here

我发现老的C编译器将information个未声明的函数视为int functionname()个. 所以我猜IntelliSense认为flockfile还没有声明,尽管我肯定在使用flockfile的文件的顶部包含了stdio.h.

当我在VS Code上打开stdio.h时,fnlockfile的定义显示为无法访问的代码.

enter image description here

然而,该项目编译正常,没有与fnlockfile相关的警告,构建的应用程序也可以正常工作. 所以我认为这个问题的根本原因是IntelliSense使用的编译器接收的参数与实际编译器接收的参数不同.

如何才能让IntelliSense像实际编译器一样解释代码?

我在网上搜索了相关报道,但没有找到. 在包含stdio.h之前添加__USE_POSIX199506个定义可能会解决这个问题,但我在几个文件中使用了stdio.h,我不想在每次包含stdio.h时都编写该定义.

环境:

Host OS: Windows10
Guest OS: Ubuntu 22.04.4 LTS (WSL2)
Compiler: gcc version 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04)
Editor: VS Code(1.87.2) with C/C++ extension from Microsoft (v1.19.9)

.vscode/c_cpp_properties.json个文件;.vscode/c_cpp_properties.json个文件;

{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "c17",
            "cppStandard": "gnu++17",
            "intelliSenseMode": "linux-gcc-x64",
            "configurationProvider": "ms-vscode.cpptools"
        }
    ],
    "version": 4
}

which gcc个答案/usr/bin/gcc

我对编译程序不在行,所以如果这是一个愚蠢的问题,很抱歉…


编辑(添加可重现的小 map 示例)

  1. 创建新项目文件夹.

  2. 创建main.c

#include <stdio.h>

int main(void)
{
    flockfile(stderr);
    fprintf(stderr, "hello world\n");
    funlockfile(stderr);
    return 0;
}
  1. 创建.vscode个文件夹,并将上面的c_cpp_properties.json放入.

  2. 运行以下命令以生成和运行可执行文件.

$ cc -g -W -Wall -Wno-unused-parameter -iquote . -pthread -iquote platform/linux -c main.c -o main.o
$ cc -g -W -Wall -Wno-unused-parameter -o out.a main.o
$ ./out.a
hello world
  1. 然而,VS Code中的智能感知无法正确检测flockfile.

enter image description here

推荐答案

有了C/C++扩展(Cpptools)(以及VS代码的许多其他C/C++扩展),IntelliSense与构建是分开的.请参见the related official FAQ entry.您要么需要手动配置提供IntelliSense的VS代码扩展,以了解您究竟是如何进行构建的,要么需要找到一个同时执行这两种操作的扩展,或者一个将构建信息集成到C/C++扩展such as the CMake extension的扩展.

在这个特定的例子中,您在构建过程中传递了-pthread,但没有传递给intellisense的C/C++扩展.

C++相关问答推荐

C sscanf没有捕获第二个参数

gcc已编译的可执行文件TSB是否同时暗示最低有效字节和最低有效位?

segfault在C中使用getline()函数

如果实际的syscall是CLONE(),那么为什么strace接受fork()呢?

如何在C宏中确定Windows主目录?

返回一个包含数组的 struct

为什么在Linux(特别是Ubuntu 20.04LTS)上,POSIX共享内存对象在重启后仍然存在,然后突然变成了根用户?

为什么输出不是从上到下C

如何在C宏中确定 struct 中元素的类型?

如何创建一个C程序来存储5种动物的名字,并在用户 Select 其中任何一种动物时打印内存地址?

fwrite无法写入满(非常大)缓冲区

使用scanf在C中读取和存储文件中的值

在C语言中,是否可以使枚举数向后计数?

防止C++中递归函数使用堆栈内存

如何对现有的双向循环链表进行排序?

如何在不读取整个字符串的情况下删除UTF8字符串的尾随空格以提高性能?

C++中PUTS函数的返回值

从系统派生线程调用CRT

在C中交换字符串和数组的通用交换函数

无法在线程内用 C 打印?