2010-03-22 15 views
7

verwenden Wie verwende ich Funktion wieWie unbenannte Funktionsargumente in C oder C++

erklärt Argumente
void f(double) 
{ 
    /**/ 
} 

wenn es möglich ist?

+2

Ihre Frage nicht erhalten –

+2

__No__. Einfach einen Namen hinzufügen, der eine vorherige Deklaration nicht bricht –

Antwort

39

ich ein Beispiel hoffen, etwas Hilfe bieten kann:

// Declaration, saying there is a function f accepting a double. 
void f(double); 

// Declaration, saying there is a function g accepting a double. 
void g(double); 

// ... possibly other code making use of g() ... 

// Implementation using the parameter - this is the "normal" way to use it. In 
// the function the parameter is used and thus must be given a name to be able 
// to reference it. This is still the same function g(double) that was declared 
// above. The name of the variable is not part of the function signature. 
void g(double d) 
{ 
    // This call is possible, thanks to the declaration above, even though 
    // the function definition is further down. 
    f(d); 
} 

// Function having the f(double) signature, which does not make use of 
// its parameter. If the parameter had a name, it would give an 
// "unused variable" compiler warning. 
void f(double) 
{ 
    cout << "Not implemented yet.\n"; 
} 
+0

Dies ist die beste Antwort hier. +1. –

+0

Ich stimme zu, +1 von mir –

+0

OK, es funktioniert gut.Sorry für mein Englisch. – zed91

2

Nein. Sie müssen ihm einen Namen geben. I.e.

void f(double myDouble) 
{ 
    printf("%f", myDouble * 2); 
} 

oder wenn Sie mit iostreams:

void f(double myDouble) 
{ 
    cout << myDouble * 2; 
} 
+0

printf() in C++? – Alan

+0

@Alan: 'varargs.h' und die varargs Syntax und Unterstützung. – dmckee

+2

@Alan: Die Frage ist gleichermaßen auf C oder C++ anwendbar, also habe ich die C-Funktion benutzt. –

0

Der Parameter auf den Stapel kann noch gestellt bekommen, so können Sie in der Lage sein, es dort zu finden (siehe Kommentare unten)

Für Beispiel nur (hoch nicht tragbaren)

#include<stdio.h> 
void f(double) 
{ 
    double dummy; 
    printf("%lf\n",*(&dummy-2)); //offset of -2 works for *my* compiler 
} 

int main() 
{ 
    f(3.0); 
} 

Ich bin nicht sicher, warum diese

+0

Dies ist in hohem Maße implementierungsabhängig (abhängig von CPU, ABI usw.). –

+0

@Paul R. Es ist meine Interpretation der Frage. Zumindest bis das OP es klarstellt. Ich habe eine Notiz zu meiner Antwort –

+0

notiert und -1 entfernt. Schlagen Sie auch 's/will/may /' und 's/can/können \ können, da es viele ABIs gibt, die Register zum Übergeben von Parametern verwenden. –

-2

Compiler obwohl wollen würde tun, wird standardmäßig 0 passieren .... its die Art, wie wir früher postfix Inkrementoperator unterscheiden, und wir haben nie bestanden den tatsächlichen Wert verwenden ..

+0

Unbenannte Argumente sind nicht verwandt und nicht mit Standardwerten korreliert. Wenn nicht die Person, die die Funktion mit dem unbenannten Argument deklariert hat, auch den Standardwert 0 angibt, gibt der Compiler nicht standardmäßig 0 aus, und der Aufrufer kann - und muss - einen bestimmten Wert übergeben, obwohl dieser unbrauchbar ist keinen Identifikator haben. Der Randfall von 'operator ++' oder 'operator -' ist ein unglücklicher Mangel in dem Design, das jetzt in Stein gemeißelt ist, aber es hat keine Beziehung zu wie alle anderen unbenannten oder Standardargumente wirken. –

1

Hier ist eine gute link

void bar(int arg1, int /* Now unnamed */, int arg3) 
{ 
    // code for bar, using arg1 and arg3 
} 

Manchmal wird der obige Ansatz nicht nur verwendet, um Legacy-Code zu unterstützen, sondern auch, um sicherzustellen, dass eine überladene Funktion ausgewählt wird, vielleicht ein Konstruktor. Mit anderen Worten, Sie übergeben ein zusätzliches Argument, um sicherzustellen, dass eine bestimmte Funktion ausgewählt wird. Außerdem kann es während der Codeentwicklung hilfreich sein, ein unbenanntes Argument zu verwenden, wenn Sie beispielsweise Stubs für einige Routinen schreiben.

Wenn möglich, sollte wahrscheinlich argumentiert werden, dass unbenutzte Parameter sowohl von der Funktion als auch von allen Aufrufpunkten vollständig entfernt werden sollten, es sei denn, Sie versuchen speziell, den Operator neu zu überladen oder so etwas.

Verwandte Themen