Компиляция с int main (void) завершается неудачно; main (int argc, char * argv []) завершается успешно. Зачем? - PullRequest
5 голосов
/ 30 декабря 2011

Задача

Почему компиляция программы с основной функцией int main(void) отличается от компиляции программы с основной функцией int main(int argc, char *argv[]), если программа не использует аргументы, переданные в командной строке?

Эта ОС или компилятор специфичны? Я не получаю те же результаты, используя mingw и g ++ (что странно, не правда ли, так как wingw - это порт gcc) .


Пример

Код

#include <iostream>
#include"SDL/SDL.h"
int main(void)
{
    return 0;
}

Команды компиляции

g++ test.cpp; #g++ 4.4.5
i586-mingw32msvc-g++ test.cpp; # mingw 4.4.4

Error

(Дано второй командой.)

a(main.o):(.text+0x85): undefined reference to `_WinMain@16'

Ответы [ 2 ]

10 голосов
/ 30 декабря 2011

Это вещь SDL. В Windows, когда вы включаете SDL.h, main переопределяется в SDL_main, что вызывает WinMain (реальная точка входа в не консольные приложения Windows), выполняет некоторую инициализацию и, наконец, вызывает ваш основной код. Он имеет подпись с argc и argv, и вы в значительной степени обязаны следовать ей, поэтому int main() не будет работать.

0 голосов
/ 30 декабря 2011

Спецификация main (...) является контрактом. В языке C контракт говорит, что аргументы являются int и char **. Это требование, которое должна выполнять ваша программа, если она хочет, чтобы среда взаимодействовала с ней.

Вопрос о том, хочет ли ваша программа использовать параметры, является другим вопросом - ей просто необходимо соблюдать договор о том, что существует функция с именем main, с правильным порядком и типом параметров.

...