1

在任何情况下都可以从源文件中省略函数声明吗?我有一个无法编译的 C 项目,我不知道为什么。据我所知,当编译器(GCC 4.4.1)在'system.h'中找到函数'sysData'的声明时,找不到'sepData'typedef的声明。

来自脓毒症.h

typedef struct {
    int16 intensity;
    int16 offset;
} sepData;

来自脓毒症.c

sepData sepR, sepIR;

从系统.h

void sysData(sepData *sepR, sepData *sepIR);

来自 system.c

#include "system.h"
#include "sepsis.h"

extern sepData sepR, sepIR;

void sysData(sepData *sepR, sepData *sepIR)
{
}

如果我从“system.h”中删除“sysData”的声明,则项目编译不会出错。我对 C 不太了解,我认为包含这样的声明是强制性的。有谁能够解释这里发生了什么?

4

2 回答 2

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)
{
}
于 2012-06-13T23:19:39.627 回答
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()没有使用过该函数。如果您在声明之前使用了该函数,我希望编译器会给您一条警告消息,并假设每个参数都应该是 anint并且返回类型也应该是 an int。(旧的 K&R 规则。)这当然行不通,但它为什么行不通可能并不明显。(耶 C.)

于 2012-06-13T23:21:20.767 回答