2012-11-21 10 views
13

Voglio chiamare bar() in foo(), bar() cambierà alcuni valori di variabili globali (questo è quello che voglio), ma nel frattempo produrre un output (non desidero alcun output);C - Come sopprimere l'uscita di una sottofunzione?

void foo() 
{ 
    //I have tried: 
    //system("1>&/dev/null") and of course this won't work 
    bar(); 
} 

Cosa posso fare per sopprimere l'uscita bar() s'?

risposta

14

È possibile salvare la variabile globale stdout prima del bar();, quindi impostarla su /dev/null, quindi ripristinarla. Esempio di codice;

#include <stdio.h> 

int main() { 
    int old_stdout = dup(1); 

    freopen ("/dev/null", "w", stdout); // or "nul" instead of "/dev/null" 
    printf("asd1"); 
    fclose(stdout); 

    stdout = fdopen(old_stdout, "w"); 
    printf("asd2"); 
    return 0; 
} 

Testato su OS X, non sono sicuro di Windows.

EDIT: È possibile sostituire /dev/null con nul su Windows. Per quanto riguarda il fdopen() e il dup() che funzionano sotto Windows, fanno parte dello standard POSIX.1 secondo le mie pagine man, ma non l'ho provato.

MODIFICA 2: Come suggerito nei commenti, se la soluzione non funziona per Windows, c'è un altro suggerimento in this SO answer.

EDIT 3: Un modo più lungo, anche se conforme agli standard e multipiattaforma per fare ciò è il seguente. (Codice adattato da detto SO domanda e la documentazione di Microsoft per _dup)

#include <stdio.h> 

#ifdef _WIN32 
#include <io.h> 
char * const nulFileName = "NUL"; 
#define CROSS_DUP(fd) _dup(fd) 
#define CROSS_DUP2(fd, newfd) _dup2(fd, newfd) 
#else 
#include <unistd.h> 
char * const nulFileName = "/dev/null"; 
#define CROSS_DUP(fd) dup(fd) 
#define CROSS_DUP2(fd, newfd) dup2(fd, newfd) 
#endif 

int main() { 
    int stdoutBackupFd; 
    FILE *nullOut; 
    /* duplicate stdout */ 
    stdoutBackupFd = CROSS_DUP(STDOUT_FILENO); 

    fflush(stdout); 
    nullOut = fopen(nulFileName, "w"); 
    CROSS_DUP2(fileno(nullOut), STDOUT_FILENO); 

    printf("asd1\n"); 
    fflush(stdout); 
    fclose(nullOut); 

    // Restore stdout 
    CROSS_DUP2(stdoutBackupFd, STDOUT_FILENO); 
    close(stdoutBackupFd); 

    printf("asd2\n"); 

    return 0; 
} 

Le vampate sono tenuti a fare in modo che (1) niente stampato prima di passare stdout è infatti stampato a schermo, e (2) niente che era stampato prima di riportare lo stdout su console (o pipe).

+1

Potrebbe funzionare con sistemi basati su Unix (Linux, Mac OS X). Non funzionerà mai sotto Windows, poiché nei percorsi di file del mondo di Windows come "/ dev/null" non sono possibili. –

+0

Credo che '/ dev/null' sia la parte facile. Vedi la mia modifica. – user1071136

+0

È possibile assegnare 'stdout' come si fa nella chiamata' fdopen'? Lo standard specifica che lo stdout deve essere un 'l-value'? Farebbe meglio a farlo in questo modo: http://stackoverflow.com/a/7664951/922712 – user93353

Problemi correlati