gpt4 book ai didi

c - 省略函数声明

转载 作者:太空宇宙 更新时间:2023-11-04 01:38:03 24 4
gpt4 key购买 nike

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

来自sepsis.h

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

来自 sepsis.c

sepData sepR, sepIR;

来自系统.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",那么当您制作原型(prototype)时类型 ​​sepData 将不知道sysData() 函数,您会收到错误消息。您可以通过交换两个 header 的顺序来解决这个问题:

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

但这只能修复这个特定的编译单元。如果您在此应用程序中有其他编译单元,您将需要关心 #include 行的顺序,这会让人厌烦。也许 system.h 需要 #include "sepsis.h" 本身——并且让 sepsis.h 通过通常的咒语防止多重包含:

#ifndef _SEPSIS_H_
#define _SEPSIS_H_
...
#endif // _SEPSIS_H_

您的代码库能够在没有 sysData() 原型(prototype)的情况下进行编译,因为您在函数声明之前没有使用该函数。如果您在声明之前使用该函数,我希望编译器会给您一个警告消息并假设每个参数都应该是一个int并且返回类型也应该是一个整数。 (旧的 K&R 规则。)这当然行不通,但可能为什么行不通。 (Yay C.)

关于c - 省略函数声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11024661/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com