2013-08-13 12 views
6

Czy są możliwe metody zapisu programu C bez uwzględnienia stdio.h jako pliku nagłówkowego. Sugerowano, że może on być realizowany przez deklarując extern int scanf(char* format, ...);Jak używać funkcji scanf() bez uwzględniania stdio.h

#include <stdio.h> //I want this same code to work without including this line 

int main() 
{ 
    char str [80]; 
    scanf ("%s",str); 
    return 0; 
} 
+15

dlaczego uważasz, że 'stdio.h' jest złe? –

+0

Przekonasz się, że w C, nie w C++ potrzebujesz 'stdio.h' częściej, niż myślisz. Na przykład w C, gdzie zdefiniowano 'NULL'? – cdarke

+2

@WouterHuysentruit Chcę tylko wiedzieć, czy są możliwe rozwiązania. – Niko

Odpowiedz

10

Można zadeklarować funkcję scanf z:

extern int scanf(const char *format, ...); 

extern Hasło jest opcjonalne, ale chciałbym, aby uwzględnić go jako przypomnienie faktu funkcja jest zdefiniowana gdzie indziej.

Wasz przykład będzie wtedy wyglądać tak:

extern int scanf(const char *format, ...); 

int main() 
{ 
    char str [80]; 
    scanf ("%s",str); 
    return 0; 
} 
+9

Działa to tylko wtedy, gdy 'scanf' jest zaimplementowany jako funkcja. Nie ma nic w wymaganiach C mówiących, że nie może to być makro wywołujące jakąś inną funkcję, taką jak 'fscanf'. –

+0

Jeśli można go użyć, możesz napisać dla mnie kod. Zmodyfikuj swoją odpowiedź: – Niko

+7

@DavidHammen No. Od sekcji 7.1.4/1, przypis 155 normy ISO C99: "Oznacza to, że implementacja powinna zapewniać faktyczną funkcję dla każdej funkcji biblioteki, nawet jeśli zapewnia również makro dla tej funkcji funkcjonować." Makra mogą być dostarczane * dodatkowo * do standardowych funkcji bibliotecznych, ale nie można ich całkowicie zastąpić. – jamesdlin

1

W C-89, że kod będzie kompilować bez #include, jako prototypy funkcji są opcjonalne.

powiedziawszy, który chodzi pod listą „naprawdę złych rzeczy do zrobienia” - scanf może być makro, może mieć jedną lub więcej wymaganych parametrów ...

Więc można to zrobić, ale to tak, jakby jechać w nocy bez świateł. Możesz ulec awarii, nawet jeśli uważasz, że znasz drogę.

+0

Czy mógłbyś podać przyczynę niepowodzenia? –