编译器警告 - 参数列表有所不同
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.exe
的 C4113 warning,其中包含以下消息:
SomeCode.c(10): warning C4113: 'void (__cdecl *)()' differs in parameter lists from 'void (__cdecl *)(void)'
正如我所说,源代码仍然可以成功编译并且似乎可以工作。我的目标是防止此警告在 cl
中发生,因为 gcc
在编译时不会生成任何警告。
我假设该函数的声明未被视为 void SomethingBeforeExit(void)
,但是,我不知道如何将函数的参数列表明确声明为 void
.
我正在为 cl.exe
和 gcc v5.4.0
编译器使用 VS14
和 C/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();
声明不需要更新,但最好也更新它,以便可以对看不到定义的代码进行参数检查。
我正在尝试编译以下在 gcc
和 Microsoft 的 cl.exe
.
void SomethingBeforeExit();
void SomethingBeforeExit()
{
// some code
_exit(0);
}
int main(int argc, char *argv[])
{
// some code
atexit(SomethingBeforeExit);
}
但是,我收到来自 cl.exe
的 C4113 warning,其中包含以下消息:
SomeCode.c(10): warning C4113: 'void (__cdecl *)()' differs in parameter lists from 'void (__cdecl *)(void)'
正如我所说,源代码仍然可以成功编译并且似乎可以工作。我的目标是防止此警告在 cl
中发生,因为 gcc
在编译时不会生成任何警告。
我假设该函数的声明未被视为 void SomethingBeforeExit(void)
,但是,我不知道如何将函数的参数列表明确声明为 void
.
我正在为 cl.exe
和 gcc v5.4.0
编译器使用 VS14
和 C/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();
声明不需要更新,但最好也更新它,以便可以对看不到定义的代码进行参数检查。