**关闭。**这个问题是not reproducible or was caused by typos。目前不接受答复。
此问题是由打印错误或无法再重现的问题引起的。虽然类似的问题可能是on-topic在这里,这一个是解决的方式不太可能帮助未来的读者。
昨天关门了。
Improve this question
我的代码示例很简单:
#include <fstream>
int main() {
int printDebug=1; // 1 - turn on, 0 -turn off.
if (printDebug==1){
ofstream output_file("outputDelta.txt"); // create output file
}
for (int i = 0; i < 1e2; i++){
if (printDebug==1){
output_file << i <<"\n";
}
}
return 0;
}
它不会编译,因为“error:未在此作用域中声明“output_file”。我的整个想法是,如果我不在printDebug模式下,就不要声明任何output_file。我不想创建空的输出或空分配内存。你会怎么解决呢?
1条答案
按热度按时间zf9nrax11#
你需要知道作用域在C++中是如何工作的。如果你在一个作用域中有一个变量(在
{ }
之间),这个变量将在它的作用域结束时被销毁。if
语句的主体也是一个作用域。即使你没有花括号,只有一个像这样的语句:变量只能在声明它的作用域或任何嵌套作用域中使用。这意味着我仍然可以使用新作用域中第一个声明了
y
的代码片段中的x
,但不能从外部作用域访问y
。当我正确理解你的意图时,你想要类似于这样的东西:
请注意,
DEBUG_LEVEL
现在不是变量,而是宏。预处理器将检查#if
s的条件,如果它们的计算结果为true,则保留代码,否则将其删除。因此,所有“删除”的代码都不会被编译。当您将DEBUG_LEVEL
设置为其他值时,就好像您刚刚注解掉了每个#if DEBUG_LEVEL == 1
和#endif
之间的行。正如@Ayxan Haqverdili所指出的,编写所有这些
#if
和#endif
会污染你的代码,使其更难阅读和理解。如果你想要一个更好的替代方案,网上有很多可用的记录器,但是如果你想创建自己的记录器,这并不难(创建一个简单的记录器)。
在我的一个游戏里有这样的东西:
这只是一个很小的例子,但我有这样的东西。由于预处理器只会在
DEBUG_LEVEL
是1
时定义DEBUG_LOG(msg)
被我的日志函数替换,所以日志函数只会在那时被调用,如果DEBUG_LEVEL
是0
,那么它将什么也不做。