编译器警告 - 参数列表有所不同

Compiler warning - something differs in parameter lists

我正在尝试编译以下在 gcc 和 Microsoft 的 cl.exe.

上成功编译的源代码
void SomethingBeforeExit();

void SomethingBeforeExit()
{
    // some code
    _exit(0);
}

int main(int argc, char *argv[])
{
    // some code
    atexit(SomethingBeforeExit);
}

但是,我收到来自 cl.exeC4113 warning,其中包含以下消息:

SomeCode.c(10): warning C4113: 'void (__cdecl *)()' differs in parameter lists from 'void (__cdecl *)(void)'

正如我所说,源代码仍然可以成功编译并且似乎可以工作。我的目标是防止此警告在 cl 中发生,因为 gcc 在编译时不会生成任何警告。

我假设该函数的声明未被视为 void SomethingBeforeExit(void),但是,我不知道如何将函数的参数列表明确声明为 void.

我正在为 cl.exegcc v5.4.0 编译器使用 VS14C/C++ 19.00.23918 for x86 来比较生成的警告。

在 C 中,函数声明中的空括号并不意味着 "no parameters.",而是表示任意数量的参数(类似于 C++ 中的 ...)。也许您要声明的是 void SomethingBeforeExit(void).

OP 未使用兼容的 C99/C11 编译器。代码有效 C (C99/C11).

// declares function SomethingBeforeExit and no info about it parameters.
void SomethingBeforeExit();

// declares/defines function SomethingBeforeExit and 
// indirectly specifies the parameter list is `(void)`
// This does not contradict the prior declaration and so updates the parameter signature.
void SomethingBeforeExit() {
   ...  
}

int main(int argc, char *argv[]) {
  ...
  // `atexit() expects a `void (*f)(void))`
  atexit(SomethingBeforeExit);

在 C89 中,void SomethingBeforeExit() { ...} 定义仍然没有提及参数列表。这可能是 OP 问题的原因。

修复:

void SomethingBeforeExit(void) { 
  ...
}

之前的 void SomethingBeforeExit(); 声明不需要更新,但最好也更新它,以便可以对看不到定义的代码进行参数检查。