省略函数声明

问题描述 投票:0回答:2

是否存在可以接受从源文件中省略函数声明的情况?我有一个 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 不太了解,我认为包含此类声明是强制性的。有谁能解释一下这是怎么回事吗?

c include
2个回答
2
投票
#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.)


2
投票
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) { }

	
© www.soinside.com 2019 - 2024. All rights reserved.