Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么在源文件中定义一个函数,然后在使用其引用之前在另一个文件中声明它?_C - Fatal编程技术网

C 为什么在源文件中定义一个函数,然后在使用其引用之前在另一个文件中声明它?

C 为什么在源文件中定义一个函数,然后在使用其引用之前在另一个文件中声明它?,c,C,我在《末日之源》中发现了以下模式,我不知道该怎么做 敌方.c // A nice definition, but there is no corresponding header file, kind of weird void A_Pain (mobj_t* actor) { if (actor->info->painsound) S_StartSound (actor, actor->info->painsound); } info.c

我在《末日之源》中发现了以下模式,我不知道该怎么做

敌方.c

// A nice definition, but there is no corresponding header file, kind of weird
void A_Pain (mobj_t* actor)
{
    if (actor->info->painsound)
    S_StartSound (actor, actor->info->painsound);   
}

info.c

// Now it's redeclared, but without a parameter?
void A_Pain();
// ...
state_t states[NUMSTATES] = {
// ...
    {SPR_PLAY,6,4,{A_Pain},S_PLAY,0,0}, // S_PLAY_PAIN2
// ...
}
当代码库的其余部分使用头文件时,为什么不使用头文件呢?这种方法有好处吗


为什么要用不同的签名在不同的源文件中声明函数?

我认为这不是一个好的做法。但是根据我对C标准的理解,当你声明一个函数,比如
void a_Pain()基本上,该函数可以取任意数量的参数,这不同于C++。所以在C语言中你需要使用
void A_Pain(void)
表示它没有参数


但在C++中,ValuaApPrand();

表示它不带参数。

在C中,声明
tf()
不声明函数
f
返回
T
并带零参数;它声明一个函数
f
,返回
T
,并接受未指定数量的参数

即使函数定义位于源文件不知道的转换单元中,也可以将函数声明放在源文件中,因为将其连接在一起是由链接器而不是编译器完成的

为什么不使用头文件

这并没有真正的区别,头文件只是文本包含。将声明放在头文件中是有意义的,特别是当它们在多个地方使用时,但这不是必需的。只要每个编译单位都同意这个名字的意思,事情就会进展顺利

为什么要用不同的签名在不同的源文件中声明函数


他们没有不同的签名;如果他们这样做了,就会有问题。但是
info.c
中的声明没有参数列表。只要“参数列表[定义中]不应有省略号终止符,且每个参数的类型应与默认参数升级产生的类型兼容”(N256 6.7.5.3,这可能是适用于Doom的规范的错误版本,但实际上并不重要)。换句话说,如果一个函数是在没有签名的情况下声明的,那么它的参数的数量和类型将根据调用方式推断出来。只要这个推论是正确的,你就有一个可以正常工作的有效程序。它只是过时的,而且由于缺乏明确性,维护起来有点困难。

有好几天,你不能在函数声明中指定参数。最可能的解释是,这是一个错误,在审查中没有发现。只要调用
A_Pain
的代码传递了正确的参数类型,就不会有任何运行时问题。根据编译器和警告级别的不同,可能没有发出诊断,也可能只是一个被忽略的警告。@KamilCuk:Doom很旧,但没有那么旧。程序的其余部分都是用头编写的,除了这部分。这种方法有什么可以想象的优点吗?我能想到的一个优点是,如果A_痛苦的特征改变了,你只需要改变敌人,但你不需要改变信息。也就是说,您仍然需要重新编译这两个代码。@MarvinIrwin您希望在代码库中保持一致性,但大多数情况下您都是错的:)