2009-11-17 5 views
14

E 'possibile dire al preprocessore C per verificare se una funzione (non una macro) è dichiarata? Ho provato quanto segue, ma non sembra funzionare:Verificare se la funzione è dichiarata con il preprocessore C?

#include <stdio.h> 

int main(void) 
{ 
#if defined(printf) 
    printf("You support printf!\n"); 
#else 
    puts("Either you don't support printf, or this test doesn't work."); 
#endif 
    return 0; 
} 
+0

Sono molto interessato alla ragione di questo. Le librerie con cui stai lavorando dovrebbero essere coerenti, per cogliere il tuo esempio: non ci sarà uno stdio.h senza printf e se printf potrebbe essere rimosso in un lontano futuro, non saprai ora come procede la sostituzione da chiamare. – flokra

+0

Penso che non sia specificamente per printf, ma solo per qualsiasi nome di funzione. Ma, se vuoi sapere se le funzioni ci sono, basta chiamarlo - l'errore del compilatore ti dirà :-) – paxdiablo

+5

Il mio principale incentivo è stato controllare funzioni come bcopy() o arc4random() (quando scrivi programmi multipiattaforma) , che non sono sempre definiti. – Michael

risposta

21

No. preprocessore viene eseguito prima il compilatore C e le dichiarazioni di funzione processi C compilatore. Il preprocessore è lì solo per l'elaborazione del testo.

Tuttavia, la maggior parte dei file di intestazione include macro di protezione come _STDIO_H_ che è possibile verificare nella fase del preprocessore. Tuttavia, tale soluzione non è portatile in quanto i nomi delle macro di protezione include non sono standardizzati.

0

Poiché il preprocessore non è a conoscenza del linguaggio C/C++ (in realtà fa solo la sostituzione del testo), suppongo che ciò non sia possibile. Perchè vuoi fare questo? Forse c'è un altro modo.

1

Il preprocessore è un programma semplice e non conosce quasi nulla della lingua sottostante. Non può sapere se una funzione è stata dichiarata. Anche se potesse, la funzione può essere definita in un'altra libreria e il simbolo viene risolto durante il collegamento, quindi il preprocessore non può essere d'aiuto in tal senso.

5

Se si guardano gli strumenti come autoconf, si vedrà che eseguono molti test per determinare cosa ha o non ha un computer, per compilare correttamente, quindi impostano i #DEFINES corretti.

Si potrebbe voler guardare quel modello, e quello strumento se si è su qualche sapore di Unix, come quello che vuoi fare non sarà possibile, come senza dubbio gli altri stanno sottolineando.