【问题标题】:CLion not finding header in main.c for use in external .c fileCLion 在 main.c 中找不到用于外部 .c 文件的标头
【发布时间】:2016-01-06 11:07:56
【问题描述】:

所以我的情况是这样的,我有三个文件:

main.c:

#include <stdio.h>
#include "hello.h"

int main() {
    hello();
}

你好.h:

void hello();

你好.c:

void hello() {
    printf("Hello");
}

我的 Cmake 文件如下所示:

cmake_minimum_required(VERSION 3.3)
project(test)

set(SOURCE_FILES main.c hello.c)
add_executable(test ${SOURCE_FILES})

代码运行良好。但是 CLion 无法识别 hello.c 中的 printf() 函数,并希望我将其添加为头文件。有没有办法让它在 main.c 文件中看到#include &lt;stdio.h&gt;,并停止给我带来麻烦?


所以我通过使我的 .c 文件中定义的函数返回值而不是在这些函数中调用 printf 来解决这个问题。然后打印 main.c 中返回的值

【问题讨论】:

    标签: c cmake clion


    【解决方案1】:

    hello.cmain.c 是独立的编译单元,因此两者都需要有 #include &lt;stdio.h&gt;。实际上,在您的示例中,main.c 中的 #include &lt;stdio.h&gt; 没有任何作用,因为在 hello.hmain.c 中都没有使用任何前向声明。

    在自己编译 hello.c 时,您实际上应该会看到警告。


    当编译器发现一个它不知道的函数(尚未声明)时,它假定它具有签名int function_X(void)。因此,对于您的情况,具有int printf(char const*, ...)printf 将是错误的。但是你很幸运,由于参数在你的平台中传递的方式,一切正常。

    所以你基本上需要转发声明函数,以确保编译时编译器知道将参数放在哪里,以便被调用的函数可以找到它。

    还有更多内容,但这个简短的解释对于初学者来说应该足够了,如果您阅读了我在 cmets 中提供的链接中的一本书,您应该能够更好地理解它。

    【讨论】:

    • 是的,但代码仍然有效。在我的实际用例中,我不打算单独编译非 main.c 文件,并且在每个文件中添加 stdio 标头会很痛苦。您说在 main.c 中包含 stdio 标头没有任何作用,但是如果我将其删除,则代码将不起作用。我想我只是将文件集合视为一个可执行文件,而编译器会分别查看不同的 C 文件
    • 其实我只是把stdio头去掉了,代码还是可以用的。。。也许是找到printf函数的时候自动添加头
    • @AlexDB 你知道函数声明在 C 中是如何工作的——尤其是隐式声明吗?还有,你知道头文件是怎么工作的吗?
    • 我对 C 很陌生(几天),我不太确定先声明一个函数,然后再定义它的意义,我只是读到它是正确的要做的事。而且我想我知道如何使用头文件,但不知道使用头文件和仅将代码包含在头文件中(在 main 中调用它)之间的区别。
    • @AlexDB 那么也许你应该选择these book 之一并通过它。
    猜你喜欢
    • 2017-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 2013-07-02
    相关资源
    最近更新 更多