Подтвердить что ты не робот

Предупреждение GCC: неявное объявление функции "puts" недействительно в C99

Я начинаю Зед Шоу Learn C The Hard Way. Я загрузил XCode и инструменты командной строки. Но когда я скомпилирую самую первую программу:

int main(int argc, char *argv[]) {
     puts("Hello world."); 
     return 0;
 }

Я получаю это предупреждение:

ex1.c: 2: 1: предупреждение: неявное объявление функции "puts" недействительно в C99       [-Wimplicit-функция-декларация]

Программа выполняет компиляцию и выполняется правильно.

Я использую OSX 10.8.3. Ввод 'gcc -v' дает:

Использование встроенных спецификаций. Цель: i686-apple-darwin11 Конфигурируется с помощью: /private/var/tmp/llvmgcc 42/llvmgcc42-2336.11~182/src/configure --disable-check --enable-werror --prefix =/Applications/Xcode.app/Содержание/Разработчик/usr/llvm-gcc-4.2 --mandir =/share/man --enable-languages ​​= c, objc, С++, obj-С++ --program-prefix = llvm- --program-transform- name=/^ [cg] [^.-] * $/s/$/- 4.2/--with-slibdir =/usr/lib --build = i686-apple-darwin11 --enable-llvm =/private/var/tmp/llvmgcc42/llvmgcc42-2336.11 ~ 182/dst-llvmCore/Developer/usr/local --program-prefix = i686-apple-darwin11- --host = x86_64-apple-darwin11 --target = i686-apple-darwin11 --with-gxx-include-dir =/usr/include/С++/4.2.1 Модель темы: posix gcc версия 4.2.1 (основано на Apple Inc. build 5658) (LLVM build 2336.11.00)

Пожалуйста, помогите.

4b9b3361

Ответ 1

Вам нужно включить stdio.h, т.е.

#include <stdio.h> 

чтобы импортировать определение функции.

Ответ 2

Эта "книга" должна быть переименована в Learn To Hate C, следуя бессмысленным примерам, которые явно не соответствуют.

Правильный код в современном C будет простым и легким

#include <stdio.h>        // include the correct header

int main(void) {          // no need to repeat the argument mantra as they're not used
    puts("Hello world."); 
}                         // omit the return in main as it defaults to 0 anyway

В то время как исходный пример

int main(int argc, char *argv[]) {
    puts("Hello world."); 
    return 0;
}

был бы просто плохим в 1989 году, в 1999 (то есть за 18 лет до написания этого ответа, и почти за столько же лет до написания "книги" ) стандарт C был пересмотрен. В версии C99 этот вид неявной декларации функции стал незаконным - и естественно, он остается незаконным в текущей редакции стандарта (C11). Таким образом, используя puts без #include ing соответствующий заголовок, то есть добавление #include <stdio.h> (или объявление функции puts с помощью int puts(const char*);) является ошибкой ограничения.

Ошибка ограничения - это ошибка, которая должна вызывать компилятору сообщение диагностики. Кроме того, такая программа считается недействительной программой. Однако особенность стандарта C заключается в том, что он позволяет компилятору C также успешно компилировать недопустимую программу, хотя компилятор также может отклонить ее. Поэтому такой пример вряд ли является хорошей отправной точкой в ​​книге, которая должна преподавать C новичкам.