【发布时间】:2017-10-16 22:52:31
【问题描述】:
我有众所周知的错误:
implicit declaration of function 'STLINKReadSytemCalls' [-Wimplicit-function-declaration]implicit declaration of function 'printf' [-Wimplicit-function-declaration]incompatible implicit declaration of built-in function 'printf'
还有 Eclipse(更准确地说是 Atollic TrueStudio):
include '<stdio.h>' or provide a declaration of 'printf'
看了数十亿的帖子询问如何解决这个问题,似乎三个问题可能导致这些错误:
- 函数在main之后定义;
- 包含使用函数所需的标头
-
#ifndef、#define和#endif没有正确包装头文件
我发现了一个帖子,其中有人似乎有这个错误,并在修复它后说 Eclipse 是问题所在。虽然找不到主题,但他的解决方案对我不起作用。就像点击函数一样,source -> add include。
main.c
int main(void) {
if (STLINKReadSytemCalls() == 1)
printf("Error in system calls.\n");
return 0;
}
fileProcessing.c
#include "../header/fileProcessing.h"
int STLINKReadSytemCalls(void) {
// mainly system calls
}
fileProcessing.h
#ifndef FILEPROCESSING_H_
#define FILEPROCESSING_H_
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int STLINKReadSytemCalls(void);
#endif /* FILEPROCESSING_H_ */
最令人困惑的部分是代码实际上可以工作。我有以下输出:
STM32 ST-LINK CLI v3.0.0.0
STM32 ST-LINK Command Line Interface
No ST-LINK detected
Unable to connect to ST-LINK!
Error in system calls.
一切似乎都很好,但编译器一直在大喊大叫。 如果需要,我将添加函数的主体,但我没有看到任何线索表明函数的主体可能导致包含错误。我一定是遗漏了一些如此明显的东西,以至于当我看到它时,我会像从未有过的那样自我捂脸;但我已经花了几个小时,我希望这很明显变得越来越薄了。
哦,昨天使用相同的包含路径和相同的目录构建它工作得非常好。我真的不知道从那以后发生了什么变化。
【问题讨论】:
-
在使用 Eclipse 时,每个项目花费一周左右的时间来追踪所有神秘的路径并包含错误是完全正常的。
-
@Lundin 老实说,这太神秘了,我认为 Eclipse 确实会导致我的问题。是否有任何合乎逻辑且可重现的方法来修复这些错误?
-
注意What are the benefits of a relative path such as "../include/header.h" for a header? 通常,您最好避免在包含标题的源文件中使用
..符号。 -
另外,你定义的头文件不应该包含它不需要编译的头文件。标题中没有任何内容需要“强大的三重奏”中的任何类型——三个最常用的标准标题,
<stdio.h>、<stdlib.h>、<string.h>——所以它们不需要包含在标题中,并且可以说不应该包含在标题中。有一个短语 IWYU — 包括您使用的内容 — 以及一个确保您遵守该短语的程序(最初由 Google 制作)。您的标头违反了 IWYU。 -
阅读您的问题后,我意识到我的标头保护装置是另一个标头的复制/粘贴。所以预处理器不想包含新的.h。可能凌晨 4 点工作与此有关...
标签: c eclipse include-path implicit-declaration