Ответ 1
Вам нужно включить stdio.h, т.е.
#include <stdio.h>
чтобы импортировать определение функции.
Я начинаю Зед Шоу 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)
Пожалуйста, помогите.
Вам нужно включить stdio.h, т.е.
#include <stdio.h>
чтобы импортировать определение функции.
Эта "книга" должна быть переименована в 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 новичкам.