Подтвердить что ты не робот

C - Как подавить выход вспомогательной функции?

Я хочу вызвать bar() в foo(), bar() изменит значения глобальных переменных (это то, что я хочу), но пока что создаю некоторый вывод (я не хочу никакого вывода);

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

Что я могу сделать для подавления вывода bar()?

4b9b3361

Ответ 1

Вы можете сохранить глобальную переменную stdout до bar();, а затем установить ее на /dev/null, а затем восстановить. Пример кода;

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

Протестировано на OS X, не уверен в Windows.

РЕДАКТИРОВАТЬ: Вы можете заменить /dev/null на nul на Windows. Что касается fdopen() и dup(), работающих под Windows, они являются частью стандарта POSIX.1 в соответствии с моими страницами man, но я его не тестировал.

РЕДАКТИРОВАТЬ 2: Как указано в комментариях, если решение не работает для Windows, есть еще одно предложение в this SO answer.

EDIT 3: Более длинный, хотя и стандартный и кросс-платформенный способ сделать это следующим образом. (код, адаптированный из упомянутого вопроса SO, и документация Microsoft для _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;
}

Флеши необходимы, чтобы удостовериться, что (1) что-либо напечатано до того, как выключение стандартного вывода действительно напечатано на экране, и (2) ничего не напечатано до того, как будет напечатано сообщение stdout на консоль (или трубу).