是否存在可以接受从源文件中省略函数声明的情况?我有一个 C 项目无法编译,我不知道为什么。据我所知,编译器(GCC 4.4.1)在到达“system.h”中函数“sysData”的声明时找不到“sepData”typedef 的声明。
来自脓毒症.h
typedef struct {
int16 intensity;
int16 offset;
} sepData;
来自脓毒症.c
sepData sepR, sepIR;
来自system.h
void sysData(sepData *sepR, sepData *sepIR);
来自系统.c
#include "system.h"
#include "sepsis.h"
extern sepData sepR, sepIR;
void sysData(sepData *sepR, sepData *sepIR)
{
}
如果我从“system.h”中删除“sysData”的声明,则项目编译时不会出现错误。由于对 C 不太了解,我认为包含此类声明是强制性的。有谁能解释一下这是怎么回事吗?
#include "system.h"
#include "sepsis.h"
如果
system.h
本身不是 #include "sepsis.h"
,那么当您对 sepData
函数进行原型设计时,sysData()
的类型将是未知的,并且您会收到错误消息。您可以通过交换两个标头的顺序来掩盖这个问题:
#include "sepsis.h"
#include "system.h"
但这仅修复了这个特定的编译单元。如果此应用程序中有其他编译单元,则需要关心
#include
行的顺序,这会很烦人。也许 system.h
需要 #include "sepsis.h"
本身 - 并让 sepsis.h
通过通常的咒语防止多重包含:
#ifndef _SEPSIS_H_
#define _SEPSIS_H_
...
#endif // _SEPSIS_H_
您的代码库能够在没有
sysData()
原型的情况下进行编译,因为您在函数声明之前没有 used 该函数。如果您在声明之前使用该函数,我希望编译器会给您一条 warning 消息,并假设每个参数都应该是 int
并且返回类型也应该是 int
。 (旧的 K&R 规则。)这当然行不通,但“为什么”行不通可能并不明显。 (是的,C.)
system.h
时,您尚未声明类型
sepData
。调换包含顺序并重试。
#include "sepsis.h"
#include "system.h"
extern sepData sepR, sepIR;
//you might also want to re-think your arguments' names
void sysData(sepData *_sepR, sepData *_sepIR)
{
}