- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有众所周知的错误:
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'
看了数十亿的帖子询问如何解决这个问题,似乎三个问题可能会导致这些错误:
#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.
一切似乎都很好,但编译器一直在大喊大叫。如果需要,我将添加函数的主体,但我没有看到任何线索表明函数的主体可能导致包含错误。我一定是遗漏了一些如此明显的东西,以至于当我看到它时,我会像从未有过的那样 self 捂脸;但我已经花了几个小时,我希望这很明显变得越来越薄了。
哦,昨天使用相同的包含路径和相同的目录构建它工作得非常好。我真的不知道从那以后发生了什么变化。
最佳答案
正如您所展示的,您的 main.c
包含对两个没有范围内声明的函数的调用:STLINKReadSytemCalls()
和 printf( )
。这与编译器发出的警告(而不是错误)相关,这是您提供的代码中唯一可以解释这些警告的内容。
在此我强调一点
问题就是我刚才描述的:在调用这些函数时缺少范围内的函数声明。您的“可能导致这些错误的四个问题”(实际上只提出了三个)描述了有时会出现此类问题的各种具体途径;它们都不是问题本身。
编译器发出警告,而不是错误。这意味着它接受代码,但不能确定它用它做了正确的事情。特别是,它依靠参数的数量和类型来猜测参数列表,并猜测函数返回 int
。这并不安全,但如果你幸运的话,它可能会起作用,或者至少看起来会起作用。
鉴于问题在于缺少函数声明,显然,解决方案是确保提供所有需要的声明,并且它们在引用这些函数的范围内。对于在同一 C 源代码之外的其他地方定义的函数,通常的解决方案是 #include
一个或多个包含所需声明的头文件。假设有问题的头文件写得恰当(标准库是,而你提供的内部是),这就是它的全部。
你的项目的布局并不完全清楚,但看起来你可以通过放置来实现这一点
#include <stdio.h>
#include "../header/fileProcessing.h"
在 main.c
的开头,正如@unwind 已经建议的那样。这种变化足以满足我的编译器。
您建议这样做会导致原始代码出现其他类型的问题。如果这是真的,那么这将构成一个完全不同的问题,如果您无法弄清楚,那么您可以考虑在这里提出。在提出的this 问题中没有暗示存在这样的问题,并且作为一个完全独立的问题,在这里提出这个问题是不合适的。
顺便说一句,我觉得你的 fileProcessing.h
#include
是标准的 stdio 有点奇怪(但没有错)。 h
、stdlib.h
和 string.h
header ,即使它不依赖于它们中的任何一个。作为一个样式规则,我强烈建议每个源文件,包括头文件,都应该#include
他们直接使用的功能所需的所有头文件,而不是其他头文件。为了支持这一点,所有 header 还应具有适当的多重包含保护,就像您实际提供的 header 一样。
因此,我会像这样重写 fileProcessing.h
:
#ifndef FILEPROCESSING_H_
#define FILEPROCESSING_H_
int STLINKReadSytemCalls(void);
#endif /* FILEPROCESSING_H_ */
...并让其他文件根据需要处理#include
上述三个标准库头文件中的任何一个或全部。
关于c - 函数的隐式声明,与头文件 include 和 ifndef 无关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44025479/
这个问题在这里已经有了答案: Boolean in ifdef: is "#ifdef A && B" the same as "#if defined(A) && defined(B)"? (5
考虑代码。 #ifndef FOO_H #define FOO_H //Code #endif 代码可以是以下情况 // Case 1: #define foo 0 // Case 2: void f
我试图弄清楚如何将 C 头文件与 #ifndef 和 #include 一起使用。假设我有这两个头文件: headerA.h: #ifndef HEADERA_H #define HEADERA_H
假设我有a.h其中包括以下内容: 假设我还有b.h其中还包括 。如果a.h有#ifndef其中的预处理器定义语句和 b.h没有。会a.h仅包含 b.h 中未包含的内容?那么当 b.h包括a.h
我只是在定义常量时考虑以下方法之间的区别: 方法1:使用 include Guard 创建一个头文件来定义所有常量: #ifndef c1 #define c1 @"a123456789" #endi
所以我试图将我在 main.cpp 中声明的库包含到我的 header.h 中 //In my main.cpp #include #include #include using namespa
这个问题在这里已经有了答案: Header guard / translation unit problem (2 个答案) 关闭 9 年前。 有个问题让我百思不得其解。我知道这样做是不对的,但我不
类声明通常是这样的: #ifndef MY_CLASS_20141116 #define MY_CLASS_20141116 ... class MyClass { ... } #endif
我在 ifndef 中有一个结构,它在 visual studio 中是灰色的。它位于一个头文件中,然后包含在另一个 cpp 文件中。 cpp文件无法访问struct,导致编译错误。 我已经在 vis
Include guards在头文件中通常用于保护代码部分免受双重包含: #ifndef FOOBAR_H #define FOOBAR_H extern void myfoofunc(void);
我正在学习 C,希望有人能解释一下使用 #ifndef 的逻辑是什么? 我还发现我看过很多 C 程序,人们似乎遵循使用 #ifndef、#define 和 #endif 之后的文件名的约定>。取这个名
我正在尝试使用 #ifndef,如下所示。 #ifndef MACRO1 || #ifndef MACRO2 .... #endif 我已经试过了: #ifndef (MACRO1 || MACRO2
如果每个 header 都使用 #ifndef,这是否意味着关于循环依赖的编译器错误不会发生? 最佳答案 不,它没有。 这意味着编译器不会尝试包含无穷大的 header ,但是循环依赖仍然会带来逻辑问
为 PAL.h 中的函数指针获取“已在 GUI.obj 中定义”的 LNK2005 //GUI.cpp #include "PAL.h" //PAL.h #define PAL_INCLUDE int
请相信我:我搜索和测试了很多...但我没有弄错这里: VERSION := 123 all: ifndef VERSION $(error VERSION not set)
这个问题可能很奇怪,我目前正在研究一些旧代码(不是我写的)。我实际上不是 C 程序员,但我想了解这部分代码实际上应该做什么。幸运的是,奇怪的部分并不太长(配置的一部分): int main () {
我有一个使用Boost库的Qt / C++项目,并且看到Boost header 包含如下内容: #ifndef Q_MOC_RUN #include #include #endif 我读到,如果
我的 program.wxs 文件中有以下片段: ... ... 我正在使用以下
这个问题可能很奇怪,我目前正在研究一些旧代码(不是我写的)。我实际上不是 C 程序员,但我想了解这部分代码实际上应该做什么。幸运的是,奇怪的部分并不太长(配置的一部分): int main () {
这个问题在这里已经有了答案: Why aren't my include guards preventing recursive inclusion and multiple symbol defi
我是一名优秀的程序员,十分优秀!