2013-08-10 19 views
6

Książka, którą obecnie czytam stwierdza, że ​​gdy deklarujesz funkcję wc, która nie przyjmuje żadnych argumentów, ale nie używasz słowa kluczowego void "wywołanie funkcji może przekazać dowolne argumenty, które chce". więc spróbowałem tego.Co oznacza pusta lista parametrów?

int number(); 

int main(void) 
{ 
    int x =1; 
    printf("%d",number(x)); 
} 

int number() 
{ 
    return x; 
} 

ale nie skompilowano? jak to działa?

+0

Gdzie jest 'numer()' 'x' się z dokładnie? Powiązany z faktycznym pytaniem o różnice w C pomiędzy 'func (void)' i 'func()' zobacz [to q & a] (http://stackoverflow.com/questions/5929711/c-function-with-no-parameters- zachowanie? lq = 1). – WhozCraig

+0

Co to za książka? Zgaduję, że książka jest albo zła, albo - bardziej rozsądnie - przestarzała. – Undefined

Odpowiedz

0

Cóż, jeśli chcesz przekazać coś do niego bez ograniczeń, może być konieczne zmiennej argumentem list.Here przykład:

#include <stdio.h> 
    #include <stdarg.h> 
    int number(int , ...); 

    int main(void) 
    { 
     int x =1; 
     printf("%d",number(1,x)); 
    } 
    int number(int n, ...) 
    { 
      va_list   ap; 
      va_start(ap,n); 
      int x = va_arg(ap,int); 
      va_end(ap); 
      return x; 
    } 

Lub jeśli po prostu chcesz przekazać x, ale nie używaj go.

#include <stdio.h> 
    int number(); 

    int main(void) 
    { 
     int x =1; 
     printf("%d",number(x)); 
    } 

    int number() 
    { 
    int x = 1; 
    return x; 
    } 

Może kompilować i pracować. Kiedy deklarujesz int number(); w C, masz na myśli, że tej funkcji można nadać typ niespecyficzny. jednak nie możesz z niego korzystać.

1

Problem polega na tym, że twój numer funkcji nie ma wiedzy o x.
Oznacza to, że jeśli masz numer funkcji return x, to nie ma on żadnego x w zakresie, aby powrócić, a więc jest to błąd kompilacji. Jeśli zamiast tego napisałeś:

int number() { 
    return 5; 
} 

skompilowałoby to dobrze.

+0

Domyślam się, że mówisz, że jeśli przekazujesz argumenty do takiej funkcji, nie możesz uzyskać do nich dostępu wewnątrz funkcji? – FutureSci

+0

Tak, dokładnie. Nie widzę zbyt wiele do tego, ale przypuszczam, że gdybyś miał tablicę wskaźników funkcji, z których większość miała określony zestaw parametrów, a jeden z nich nie wziął żadnego, mógłbyś zadeklarować, że jeden do podjęcia() zamiast (void), aby za każdym razem móc iterować po tej macierzy o tych samych parametrach. – qaphla

-2

Cóż, zredagowałem całą odpowiedź po znalezieniu odpowiedzi.

Co chcesz zrobić to numer (void) nie main (void). Właśnie tego chciałaś i która wydrukuje dowolną zmienną jako liczbę całkowitą. Jeśli przejdziesz znak "F", liczba int (void) zwróci liczbę 70, int formy "F". W kodzie:

int number(void e); 

void main(){ 
    char C = 'F'; 
    printf("%d",number(C)); 
}; 

int number(void e){ 
    return e; 
}; 

Uwaga:

Musisz zawsze przechodzą argument jeśli chcesz zmienną, która znajduje się poza zakresem.

+0

Wiem o funkcjach i parametrach, moim pytaniem jest celowe zajmowanie się przekazywaniem danych do funkcji bez określonej listy parametrów. Więc NIE, liczba() NIE powinna zawierać typu wewnątrz zakresu tego pytania. – FutureSci

+0

@worlboss Wtedy nie można zrobić mojego przyjaciela. Pamiętaj, że komputer jest "głupi". Tworzysz zasady, które będą przestrzegane absolutnie i dopóki nie określisz, że funkcja ma parametr, którego program nie będzie używał. W rzeczywistości przez wywołanie funkcji z parametrem, którego wcześniej nie podano, spowoduje to awarię programu iw debugowaniu go nie skompiluje (jeśli mam rację), ponieważ komputer nie będzie wiedział "co robić" (dlatego jesteś tu). –

+0

Powszechnie jest też jawnie wpisać main, albo jako main (void), albo jako main (char ** argv, int argc). main() nie jest mniej poprawny, ale już go nie ma. – qaphla

7

To jest przestarzała funkcja z przed C był standaryzowany, dziesiątki lat temu.

Nigdy z niego nie korzystaj.

W starożytnym C, dekadę przed twoim urodzeniem, możesz zadeklarować funkcję bez parametrów. Po wywołaniu kompilator promowałby parametry do domyślnych typów i przekazywał je do funkcji. Zasadniczo kompilator wymyślił deklaracje parametrów z argumentów w wywołaniu.

Funkcja powinna nadal być zdefiniowana jako i powinna pasować do sposobu wywołania tej funkcji.


„Feature” to niewłaściwe słowo. Tak było w tamtym czasie, ponieważ lepsze sposoby nie były jeszcze szeroko rozwinięte. W nowym języku programowania charakterystyka ta będzie uważana za wadę.

4

W uzasadnieniu odpowiedzi Erica Postpischil za chciałbym zacytować ze standardu C11 (6,11 Przyszłe kierunki językowe)

6.11.6 Funkcja declarators

Stosowanie declarators funkcyjny z puste nawiasy (nie deklaratory typów parametrów formatu prototypów) to przestarzała funkcja .

i

6.11.7 Funkcja definicje

Stosowanie definicji funkcji z oddzielną identyfikatora parametrów i listach deklaracji (nie prototyp formatu i typu parametr identyfikator declarators) jest przestarzałą funkcją.

Podkreślenie jest moje :)