2013-10-30 18 views
5

ich weiß nicht, ob es möglich ist, aber der Wikipedia-Artikel hier Compatibility of C and C++ sagt der folgende:Fangen Variablen ohne Argumente Funktion übergeben

In C eine Funktionsprototyp ohne Argumente, z.B. int foo();, bedeutet, dass die Parameter nicht angegeben sind. Daher ist es zulässig, eine solche Funktion mit einem oder mehreren Argumenten, z. foo(42, "hello world").

Im Gegensatz dazu bedeutet ein Funktionsprototyp ohne Argumente in C++, dass die Funktion keine Argumente annimmt, und das Aufrufen einer solchen -Funktion mit Argumenten fehlerhaft ist.

In C wird die richtige Art und Weise zu erklären eine Funktion, die keine Argumente annimmt durch void verwendet, ist, wie in int foo(void);.

Ich habe den folgenden Code zu testen und die übergebenen Variablen zu fangen (was nicht ganz richtig funktioniert)

#include<stdio.h> 
#include<stdarg.h> 

void foo(); 

int main() 
{ 
    int i = 3; 
    foo(i); 
    return 0; 
} 

void foo() 
{ 
// va_list args; 
// va_start(args); 
// 
// int x = va_arg (args, int); 
// printf("%d", x); 
// va_end(args); 
} 

Ist es möglich, die übergebene i oder Wikipedia über etwas zu reden zu fangen vollständig anders?

Antwort

2

Das kommt von den alten C-Tagen, als die Strenge der Sprache, nun ..., entspannt war.

Die Grundidee war, dass, wenn Sie eine Funktion in einer Übersetzungseinheit haben, sagen foo.c:

float foo(int x) 
{ 
    return 2.0F * x; 
} 

Und dann wollen Sie es in einer anderen Übersetzungseinheit verwenden, sagt main.c aber Sie wollen nicht zu Mühe mit einer Header-Datei zu schreiben, könnten Sie einfach tun:

int main() 
{ 
    float foo(); 
    float r; 
    r = foo(42); 
} 

Und Sie müssen nicht die Argumente der Funktion zu schreiben. Um fair zu sein, mussten Sie den Prototyp überhaupt nicht schreiben, aber dann würde der Compiler annehmen, dass die Funktion immer int zurückgibt, was möglicherweise nicht das ist, was Sie brauchen.

Dann, als die Sprache gereift ist, wurde diese Art von Funktionsdeklaration als eine sehr schlechte Idee entschieden, also sollten Sie es im Allgemeinen nicht verwenden (versuchen). Wenn Sie eine variadische Funktion wünschen, dann verwenden Sie sie auf jeden Fall, deklarieren Sie sie jedoch als solche. Und Sie müssen es zumindest ein echtes Argument geben, um den Anruf an va_start() zu verankern.

+0

Danke! Ich denke, das ist, was ich gesucht habe. –

4

Wenn Sie die Dokumentation für lesen, werden Sie sehen, dass es das letzte "echte" Argument in der Argumentliste benötigt. Es ist also in Plain C nicht möglich, die Argumente zu erhalten, wenn Sie keine Argumente deklarieren.

Was Sie können tun, ist die Funktion Prototyp ohne Argumente zu deklarieren, und Argumente in der tatsächlichen Definition haben.

+0

Ja, ich denke, es gibt keine Möglichkeit, auf sie zuzugreifen, habe ich absichtlich Argumente in 'va_start' weggelassen, weil das den Zweck besiegt hätte :) –

0

Sie können die Funktion mit beliebigen Argumenten aufrufen, auf die Sie jedoch nicht im Funktionsumfang zugreifen können. Trotzdem werden einige Compiler Sie warnen, wenn Sie den Prototyp nicht als int foo (void); deklarieren, da Sie dies wahrscheinlich sowieso nicht machen wollen.

5

Sie kann nicht, zumindest nicht in Standard C. Was der Wikipedia-Artikel bedeutet dieser Code:

void foo(); 

int main() 
{ 
    int i = 3; 
    foo(i); 
    return 0; 
} 

void foo(int i) 
{ 
    (void)i; 
} 

Compiliert fein in C, aber es ist ungültig in C++, da die Anzahl der Argumente nicht tun Spiel.

+0

Hast du den Wiki-Artikel gelesen? –

0

Es gibt eine Möglichkeit, auf diese Parameter im C-Programm zuzugreifen, aber ich betrachte es als einen großen Hack, der vermieden werden sollte.

Nächstes Beispiel zeigt, wie ein int-Parameter zuzugreifen:

#include<stdio.h> 
#include<stdarg.h> 

void foo(); 

int main() 
{ 
    int i = 3; 
    foo(i); 
    return 0; 
} 

void foo(int p) 
{ 
    printf("%d",p); 
} 

Nun, ich bin nicht sicher, was passiert, wenn man etwas passiert anderes dann int (zB char *), aber es kann ein nicht definiertes Verhalten verursachen .

In C++ (wie gesagt), können Sie keine Parameter an Funktionen übergeben, die keine Parameter annehmen.

+0

Sarkasmus war nicht nötig! :) –

Verwandte Themen