c++ 仅在特定情况下使用“ofstream”[已关闭]

t40tm48m  于 2023-05-19  发布在  其他
关注(0)|答案(1)|浏览(137)

**关闭。**这个问题是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。我不想创建空的输出或空分配内存。你会怎么解决呢?

zf9nrax1

zf9nrax11#

你需要知道作用域在C++中是如何工作的。如果你在一个作用域中有一个变量(在{ }之间),这个变量将在它的作用域结束时被销毁。

void main()
{ // scope of function main()
    int x;

    { // new scope
        int y;
    } // y gets destroyed here

} // x gets destroyed here

if语句的主体也是一个作用域。即使你没有花括号,只有一个像这样的语句:

if (true) // new scope
        int z;
// end of this scope

变量只能在声明它的作用域或任何嵌套作用域中使用。这意味着我仍然可以使用新作用域中第一个声明了y的代码片段中的x,但不能从外部作用域访问y
当我正确理解你的意图时,你想要类似于这样的东西:

#include <fstream>  

#define DEBUG_LEVEL 1

int main() {

    #if DEBUG_LEVEL == 1
        std::ofstream output_file("outputDelta.txt"); // create output file
    #endif

    for (int i = 0; i < 1e2; i++) {
        #if DEBUG_LEVEL == 1
            output_file << i << "\n";
        #endif
    }

    return 0;
}

请注意,DEBUG_LEVEL现在不是变量,而是宏。预处理器将检查#if s的条件,如果它们的计算结果为true,则保留代码,否则将其删除。因此,所有“删除”的代码都不会被编译。当您将DEBUG_LEVEL设置为其他值时,就好像您刚刚注解掉了每个#if DEBUG_LEVEL == 1#endif之间的行。
正如@Ayxan Haqverdili所指出的,编写所有这些#if#endif会污染你的代码,使其更难阅读和理解。
如果你想要一个更好的替代方案,网上有很多可用的记录器,但是如果你想创建自己的记录器,这并不难(创建一个简单的记录器)。
在我的一个游戏里有这样的东西:

#if DEBUG_LEVEL == 1
#define DEBUG_LOG(msg) Log::Error(msg, __FILE__, __LINE__) // some logging function
#else
#define DEBUG_LOG(msg)
#endif

这只是一个很小的例子,但我有这样的东西。由于预处理器只会在DEBUG_LEVEL1时定义DEBUG_LOG(msg)被我的日志函数替换,所以日志函数只会在那时被调用,如果DEBUG_LEVEL0,那么它将什么也不做。

相关问题