Я пытаюсь скомпилировать следующий исходный код, который успешно компилируется как на gcc
, так и на Microsoft cl.exe
.
void SomethingBeforeExit();
void SomethingBeforeExit()
{
// some code
_exit(0);
}
int main(int argc, char *argv[])
{
// some code
atexit(SomethingBeforeExit);
}
Однако я получаю предупреждение C4113 от cl.exe
со следующим сообщение:
SomeCode.c(10): warning C4113: 'void (__cdecl *)()' differs in parameter lists from 'void (__cdecl *)(void)'
Как я уже сказал, исходный код по-прежнему успешно компилируется и работает. Моя цель — предотвратить появление этого предупреждения в cl
, поскольку gcc
не генерирует никаких предупреждений при компиляции.
Я предполагаю, что объявление этой функции не обрабатывается как void SomethingBeforeExit(void)
, однако я не знаю, как конкретно объявить список параметров функции как void
.
Я использую VS14
и C/C++ 19.00.23918 for x86
для компиляторов cl.exe
и gcc v5.4.0
для сравнения сгенерированных предупреждений.
atexit
, должна быть(void)
. По историческим причинам()
не эквивалентно(void)
в (некоторых версиях) C, как в C++. - person David Schwartz   schedule 03.08.2017()
, как заявил @David Schwartz. Этот вопрос касается конкретно предупрежденияC4113
, которое связано с неправильной передачей параметров, а не о том, лучше ли использовать(void)
, чем()
. - person David Refoua   schedule 03.08.2017atexit(SomethingBeforeExit);
илиvoid SomethingBeforeExit() {
? - person chux - Reinstate Monica   schedule 04.08.2017