update tools mac for compiler macos gcc

macos - tools - homebrew



Advertencia de GCC: la declaración implícita de la función ''puts'' no es válida en C99 (2)

Este "libro" debe cambiarse de nombre a Aprender a odiar C siguiendo ejemplos sin sentido que son claramente incorrectos.

El código correcto en C moderno sería simple y sencillo.

#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

Mientras que el ejemplo original

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

habría sido simplemente malo en 1989, en 1999 (es decir, 18 años antes de escribir esta respuesta, y casi tantos años antes de que se escribiera el "libro") se revisó la norma C. En la revisión de C99, este tipo de declaración de función implícita se hizo ilegal, y naturalmente sigue siendo ilegal en la revisión actual de la norma (C11) . Por lo tanto, el uso de puts sin #include en el encabezado relevante, es decir, añadir #include <stdio.h> (o declarar la función de puts con int puts(const char*); ) es un error de restricción .

Un error de restricción es un error que debe hacer que el compilador envíe un mensaje de diagnóstico. Además, dicho programa se considera un programa no válido . Sin embargo, lo peculiar del estándar de C es que permite que un compilador de C también compile con éxito un programa no válido, aunque un compilador también puede rechazarlo. Por lo tanto, este ejemplo no es un buen punto de partida en un libro que se supone que debe enseñar C a los principiantes.

Estoy empezando Zed Shaw''s Learn C The Hard Way . He descargado XCode y las herramientas de línea de comandos. Pero cuando compilo el primer programa:

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

Me sale esta advertencia:

ex1.c: 2: 1: advertencia: la declaración implícita de la función ''puts'' no es válida en C99 [declaración-función-simple]

El programa se compila y ejecuta correctamente.

Estoy usando OSX 10.8.3. Al ingresar ''gcc -v'' obtiene:

Usando especificaciones incorporadas. Destino: i686-apple-darwin11 Configurado con: /private/var/tmp/llvmgcc42/llvmgcc42-2336.11~182/src/configure --disable-check --enable-werror --prefix = / Applications / Xcode.app / Contents /Developer/usr/llvm-gcc-4.2 --mandir = / share / man --enable-languages ​​= c, objc, c ++, obj-c ++ --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 / c ++ / 4.2.1 Modelo de hebra: posix gcc versión 4.2.1 (Basado en Apple Inc. build 5658) (LLVM build 2336.11.00)

Por favor ayuda.


Necesitas incluir stdio.h, es decir

#include <stdio.h>

al inicio para importar la definición de la función.