所以我的情况是这样的,我有三个文件:
main.c中:
#include <stdio.h>
#include "hello.h"
int main() {
hello();
}
hello.h:
void hello();
的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 <stdio.h>
,并停止给我一个艰难的时间?
所以我通过使我的.c文件中定义的函数返回值而不是在这些函数中调用printf来解决这个问题。然后打印main.c中返回的值
答案 0 :(得分:2)
hello.c
和main.c
是独立的编译单元,因此两者都需要#include <stdio.h>
。实际上,在#include <stdio.h>
main.c
中hello.h
没有做任何事情的情况下,main.c
和hello.c
中都使用了int function_X(void)
。
在自己编译printf
时,您实际上应该看到警告。
当编译器找到它不知道的函数(尚未声明)时,它假定它具有签名int printf(char const*, ...)
。因此,对于您的情况,具有git merge
的{{1}}将是错误的。但是你很幸运,由于你的平台传递参数的方式,一切都会成功。
因此,您基本上需要转发声明函数,以确保在编译编译器时知道放置参数的位置,以便被调用的函数可以找到它。
还有更多内容,但这个简短的解释应该对初学者来说已经足够了,如果您阅读我在评论中提供的链接中的一本书,您应该能够更好地理解它。