2014-11-25 15 views
5

Ho una funzione che restituisce un valore intero. Ora voglio scrivere una macro che chiama questa funzione, ottiene il valore di ritorno e antepone una stringa ad esso e restituisce la stringa risultante.Macro in C per chiamare una funzione che restituisce un intero e quindi restituisce una stringa

Ho provato questo:

#define TEST(x)  is_enabled(x) 

io chiamo questa macro nella funzione principale:

int ret = 0; 
ret = TEST(2); 
printf("PORT-%d\n", ret); 

Questo funziona perfettamente. Comunque voglio che la macro restituisca la stringa PORT-x, dove x è il valore di ritorno della funzione chiamata. Come posso fare questo?

EDIT:

Ho anche provato a scrivere in più righe come:

#define TEST(x)\ 
{\ 
    is_enabled(x);\ 
} 

e lo ha chiamato nella funzione principale:

printf("PORT-%d\n", TEST(2)); 

Ma questo dà una compilazione errore orario:

error: expected expression before â{â token 
+0

Può essere fatto scrivendo una macro che "chiama" 'sprintf', ma sarà necessario allocare un buffer e passarlo a quella macro. La domanda è: perché vuoi che inizi? Perché sembra che tu stia cercando di risolvere qualcosa nel modo sbagliato. –

+0

Perché non puoi usare 'strcat'? Perché è necessaria una macro? – Gopi

+0

Dovresti assolutamente scrivere una funzione per questo ... – Antzi

risposta

5

Utilizzare una funzione, non una macro. Non c'è una buona ragione per usare una macro qui.

È possibile risolverlo utilizzando sprintf(3), in congiunzione con malloc o un buffer. Vedere Creating C formatted strings (not printing them) o pagine man per i dettagli.

Circa la modifica: Non è necessario usare le parentesi {} in una macro, e che stanno causando il tuo errore come pre-elaborazione si tradurrebbe a qualcosa come

printf("format%d", { 
    is_enabled(x); 
}); 

Per capire meglio le macro, gcc eseguire o clang con -E flag, o prova a leggere questo articolo: http://en.wikipedia.org/wiki/C_preprocessor

+0

Infine, l'ho implementato in una funzione piuttosto che scrivere una macro. – iqstatic

2

Questo è un po 'un problema dal momento che è necessario assicurarsi che ci sia spazio per la stringa. In tutta onestà, le macro al giorno d'oggi potrebbero essere riservate solo per la compilazione condizionale.

costanti sono meglio realizzate con tipi enumerati e funzioni macro sono generalmente migliori come funzioni inline (con la consapevolezza che inline è un suggerimento al compilatore, non una richiesta).

Se si insiste sull'utilizzo di una macro, è possibile eseguire l'archiviazione con la memoria statica sebbene abbia problemi con i thread se li si sta utilizzando e l'utilizzo ritardato/multiplo della stringa restituita.

È anche possibile allocare dinamicamente la stringa, ma è necessario liberarla al termine e gestire le condizioni di esaurimento della memoria.

Forse il modo semplice è quello di richiedere all'utente macro fornire loro stoccaggio, lungo le linee di:

#include <stdio.h> 

#define TEST2_STR(b,p) (sprintf(b,"PORT-%d",p),b) 

int main (void) { 
    char buff[20]; 
    puts (TEST2_STR(buff, 42)); 

    return 0; 
} 

cui uscite:

PORT-42 

Nel caso macro sembra poco confuso, fa uso dell'operatore virgola, in cui l'espressione (a, b) valuta sia a sia b e ha un risultato di .

In questo caso, valuta sprintf (che popola il buffer) quindi "restituisce" il buffer. E, anche se si pensa non hai mai visto prima, siete probabilmente sbagliato:

for (i = 0, j = 9; i < 10; i++, j--) 
    xyzzy[i] = plugh[j]; 

Nonostante la maggior parte delle persone che pensano che è una caratteristica di for, è molto più di un costrutto diverso che può essere utilizzato in molti posti diversi:

int i, j, k; 
i = 7, j = 4, k = 42; 

while (puts("Hello, world"),sleep(1),1); 

(e così via).

Problemi correlati