我有三个文件如下
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");
}
但是,如果我从函数中调用它,为什么不呢?
答案 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()
函数中。
我要强调,这是一个特定于实现的解决方案。我不知道任何符合标准的解决方案,以便在重定向后恢复标准流。