includer.c 定义 foo,然后包含included.c。为什么 cpptools 无法识别included.c 中的foo?

问题描述 投票:0回答:1

我有两个C文件,

main.c
library.c
,其中包含以下内容:

// main.c
#include <stdio.h>

int MY_NUMBER = 6;

#include "library.c"

int main() {
    change_the_number();
    printf("The number: %d\n", MY_NUMBER);
}
// library.c
void change_the_number() {
    MY_NUMBER = 5;
}

运行

gcc main.c -o main
,然后运行
main
,我得到输出
The number: 5
,这正是我所期望的。

VSCode 在

MY_NUMBER
中对
library.c
下划线,抱怨“标识符
MY_NUMBER
未定义”。就我而言,这也是预期的行为 - 仅查看
library.c
,没有任何内容表明
MY_NUMBER
是什么或它来自哪里。

如何配置 Microsoft 的 C/C++ 扩展来识别

MY_NUMBER

到目前为止我尝试过的:

  • ${workspaceFolder}
    ${workspaceFolder}/**
    添加到
    C-Cpp > Default: Include Path
  • library.c
    更改为
    library.h
    (我真的认为这不会有任何作用,我是对的。)

一个限制是我无法更改代码 - 我必须设置 IDE 以允许这种声明/使用安排,因为我是一名实习生,并且这种模式在我的代码库中重复数百次(如果不是数千次)我正在努力。我会向我的同事寻求帮助,但他们都没有使用带有 C/C++ 扩展的 VSCode - 每个人都使用不同的东西。

最终,如果 MS C/C++ 扩展不支持这种事情,那很好,我只会使用其他东西,但我认为有趣的是,这个完全有效的 C 程序会被标记为有问题。

c visual-studio-code
1个回答
1
投票

万一有人偶然发现这一点,我想我应该分享我在阅读 @BoP 的答案后一段时间的认识 - 随着代码库规模的增长,我希望 linter 做的事情变得越来越困难,以至于难处理。

如果您开始尝试以我在问题中所示的方式包含

.c
文件,事情会变得有点复杂,因为您可以有一个常量 - 在我们的例子中为
MY_NUMBER
- 在原始文件中声明,并且在包含的文件中使用。这是有效的 C,如上所示。

但是 - 如果您只获取包含的文件(我的问题中的

library.c
),并与其余代码隔离地查看它,您不知道哪些代码可以包含该
.c
文件。 它可以是您计算机上的任何源代码。 linter 显然无法扫描您的整个计算机,因此问题很棘手,并且没有 linter 可以有效地完成我想要的事情。

这个故事的寓意 - 正确使用 C。

© www.soinside.com 2019 - 2024. All rights reserved.