如何禁用printf功能?

时间:2012-12-11 09:12:56

标签: c++ printf

我有三个文件如下

Test.cpp

void helloworld()
{
    disable pf;
    pf.Disable();
    printf("No statement \n");
    }
int main()
{
    disable dis;
    helloworld();
    printf("Hello World");
    system("pause");
    return 0;
}

disable.cpp

    #include "StdAfx.h"
    #include "disable.h"
    disable::disable(void)
    {#define printf(fmt, ...) (0)}
    disable::~disable(void)
   {}
   void disable::Disable()
   {
    #define printf(fmt, ...) (0)
    }

disable.h

#pragma once
class disable
{
public:
    disable(void);
    ~disable(void);
    void Disable();
};

执行后,我的输出为No Statement Hello World。 但我想通过调用two printf statementsDisable function来禁用这些disable constructor。 请帮助我为什么它不工作以及如何解决这个问题。请帮忙。

但如果我愿意,事情就可以了。

main()
{
#define printf(fmt, ...) (0)
printf("Hello World");
}

但是,如果我从函数中调用它,为什么不呢?

3 个答案:

答案 0 :(得分:5)

宏不遵守范围规则,c ++语法规则或任何其他内容。它只是一个文本替换引擎。

当您在#define printf(fmt, ...) (0)中说disable.cpp时,它仅在disable.cpp中定义。如果您要在disable.h中撰写,则会在包含disable.h的所有文件中对其进行定义。

控制宏的唯一方法是使用宏(#if和#ifdef及其同类)。因此,您可以通过以下方式实现您的目标。

#define DISABLE_PRINTF

#ifdef DISABLE_PRINTF
    #define printf(fmt, ...) (0)
#endif

但这将是全局禁用,只能通过注释掉第一个#define并重新编译代码来撤消。没有办法使用宏来禁用基于选择性/范围的控制。

编辑:建议不要重新定义printf本身,而是为此编写一个以printf定义的包装器。

答案 1 :(得分:4)

您可以通过以下方式禁用printf输出:

close(STDOUT_FILENO);

或者您也可以使用:

fclose(stdout);

这将禁用stdout的所有输出

示例:

#include<stdio.h>
#include<stdlib.h>

int main(){
    printf ("This message will be displayed\n");
    fclose(stdout);
    printf ("This message will not be displayed\n");
    // to reopen the stdout, this is another question
    return 0;
}

注意

如果你在程序中使用套接字,那么你必须小心,因为stout的关闭会导致输出重定向到套接字

答案 2 :(得分:2)

在支持它的实现上,您可以将stdout缓冲区重定向到“禁用”控制台,并在想要再次“启用”它时恢复它。这是一个代码示例,它在Linux上使用gcc(至少)。

注意这是一个特定于实现的解决方案,使用dup()中的dup2()unistd.h。标准无法保证无处不在。

#include <cstdio>
#include <unistd.h>

int main() {
    printf("Hello world.\n");
    fpos_t pos;
    fgetpos(stdout, &pos);  // save the position in the file stream
    int fd = dup(fileno(stdout));  // use the dup() function to create a copy of stdout

    freopen("dummy.txt", "w", stdout);  // redirect stdout
    printf("Hello nobody.\n");  // this is not printed to the "usual" stdout

    fflush(stdout);   
    dup2(fd, fileno(stdout));  // restore the stdout
    close(fd);
    clearerr(stdout);  

    fsetpos(stdout, &pos); // move to the correct position
    printf("Hello world again.\n");  // this is printed back to the "usual" stdout
}

您可以将该逻辑放入enable()disable()函数中。 我要强调,这是一个特定于实现的解决方案。我不知道任何符合标准的解决方案,以便在重定向后恢复标准流。