2013-10-30 17 views
5

Non so se è possibile, ma l'articolo di Wikipedia qui Compatibility of C and C++ dice quanto segue:variabili Catching passato alla funzione senza argomenti

In C, un prototipo di funzione senza argomenti, per esempio int foo();, implica che i parametri non sono specificati. Pertanto, è legale chiamare tale funzione con uno o più argomenti, ad es. foo(42, "hello world").

Al contrario, in C++ un prototipo di funzione senza argomenti significa che la funzione non accetta argomenti e la chiamata a una tale funzione di con argomenti non è corretta.

In C, il modo corretto per dichiarare una funzione che non prende argomenti è usando void, come in int foo(void);.

ho fatto il seguente codice per testarlo e catturare le variabili passate (che non funziona perfettamente ragione)

#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); 
} 

E 'possibile prendere il passato i o sta parlando di qualcosa Wikipedia completamente diverso?

risposta

2

Proviene dai vecchi C giorni in cui il rigore della lingua era, beh ... rilassato.

L'idea di base era che se si ha una funzione in un'unità di traduzione, dire foo.c:

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

E poi si desidera utilizzarlo in un'altra unità di traduzione, dire main.c ma non vuole fastidio con la scrittura di un file di intestazione, si può solo fare:

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

E non c'è bisogno di scrivere gli argomenti della funzione. Per essere onesti, non è stato necessario scrivere il prototipo, ma il compilatore presuppone che la funzione restituisca sempre int che potrebbe non essere quello che ti serve.

Quindi, con la maturazione del linguaggio, questo tipo di dichiarazione di funzione è stato deciso come una pessima idea, quindi in generale non si dovrebbe (provare a) usarlo. Se vuoi una funzione variadica, allora usala con tutti i mezzi, ma dichiarala come tale. E devi dargli almeno una vera discussione, per ancorare la chiamata a va_start().

+0

Grazie! Immagino che questo sia quello che stavo cercando. –

4

Se si legge la documentazione per , si vedrà che è necessario l'ultimo argomento "reale" nell'elenco degli argomenti. Quindi non è possibile in chiaro C ottenere gli argomenti se non si dichiarano argomenti.

Cosa si può do è dichiarare la funzione prototipo senza argomenti e avere argomenti nella definizione effettiva.

+0

Sì, credo che non ci sia modo di accedervi, ho omesso deliberatamente gli argomenti in 'va_start' perché ciò avrebbe vanificato lo scopo :) –

0

È possibile chiamare la funzione con qualsiasi argomento, ma non è possibile accedervi nell'ambito della funzione. Ad ogni modo alcuni compilatori ti daranno degli avvertimenti se non dichiarerai il prototipo come int foo (void); dato che probabilmente non vuoi farlo comunque.

5

Non è possibile, almeno non nella norma C. Ciò che l'articolo di Wikipedia significa questo codice:

void foo(); 

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

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

compila bene in C, ma è non valida in C++ perché il numero di argomenti non lo fanno incontro.

+0

Hai letto l'articolo wiki? –

0

C'è un modo per accedere a quei parametri nel programma C, ma io lo considero un grosso trucco, che dovrebbe essere evitato.

esempio seguente mostra come accedere un parametro int:

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

void foo(); 

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

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

Ora, io non sono sicuro di quello che succede se si passa qualcosa di diverso allora int (ad esempio char *), ma può causare un comportamento non definito .

In C++ (come detto), non è possibile passare i parametri alle funzioni senza parametri.

+0

Non c'era bisogno del sarcasmo! :) –

Problemi correlati