4

我有以下三个文件

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 statements通过调用Disable functiondisable constructor..来禁用这些。请帮助我为什么它不起作用以及如何解决这个问题。请帮忙。

但如果我喜欢的话,一切都会好起来的

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

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

4

3 回答 3

8

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

close(STDOUT_FILENO);

或者你也可以使用:

fclose(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 的关闭会导致输出重定向到套接字

于 2012-12-11T09:20:32.777 回答
5

宏不遵守范围规则、c++ 语法规则或任何东西。它只是一个文本替换引擎。

当您说#define printf(fmt, ...) (0)in 时disable.cpp,它仅在 disable.cpp 中定义。如果您将其写入disable.h,它将在包含 from 的所有文件中定义disable.h

控制宏的唯一方法是使用宏(#if 和 #ifdef 及其同类)。所以你想要的可以通过以下方式实现。

#define DISABLE_PRINTF

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

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

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

于 2012-12-11T09:15:02.083 回答
2

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

注意这是一个特定于实现的解决方案,使用dup()and dup2()from 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()函数中。让我强调一下,这是一个特定于实现的解决方案。我不知道有任何符合标准的解决方案可以在重定向标准流后恢复它们。

于 2012-12-11T09:27:05.827 回答