4

以下の3つのファイルがあります

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 functionしてこれらを無効にしたいと思いdisable 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;
}

ノート

プログラムでソケットを使用している場合は、スタウトを閉じると出力がソケットにリダイレクトされるため、ここで注意する必要があります。

于 2012-12-11T09:20:32.777 に答える
5

マクロは、スコープ規則、C++ 構文規則などには従いません。テキスト置換エンジンのみです。

あなたが言うとき#define printf(fmt, ...) (0)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()ます。規格によってどこでも機能することが保証されているわけではありません。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()関数に入れることができます。強調しておきますが、これは実装固有のソリューションです。リダイレクトされた後に標準ストリームを復元するための標準準拠のソリューションを私は知りません。

于 2012-12-11T09:27:05.827 に答える