定义一个像Python"with"语句一样工作的C宏有什么缺点?

Con*_*ode 0 c++ python control-structure

在使用C预处理器玩了一下后,我想到了一种类似于具有控制结构的Python的方法,定义如下:

#define with(var) for(int i##__LINE__=0;i##__LINE__<1;)for(var;i##__LINE__<1;++i##__LINE__)
Run Code Online (Sandbox Code Playgroud)

样品用法:

#include <cstdio>
#include "FileClass.hpp"
#include "with.hpp"

int main(){
    with(FileClass file("test.txt")){
        printf("%s\n",file.readlines().c_str());}
    return 0;}
Run Code Online (Sandbox Code Playgroud)

这个想法是一个双嵌套的for循环有一个外部混淆的迭代变量,它在内部循环中递增一次以打破它.这会导致以下代码在其范围内使用var执行一次.

这有什么缺点吗?如果我足够混淆迭代变量,几乎没有机会发生名称冲突,它只使用标准的预处理器功能,似乎没有任何反击的可能性,而且很容易理解.

几乎看起来好得令人难以置信 - 有什么理由不在任何地方使用它吗?

Xeo*_*Xeo 6

有没有什么理由不在任何地方使用?

是的,C++不是Python,如果我正确理解你的代码,那就完全一样了:

{
  FileClass file("test.txt");
  printf("%s\n", file.readlines().c_str());
}
Run Code Online (Sandbox Code Playgroud)

那么,有什么缺点呢?不自然的语法,用于代码混淆的预处理器的使用,使用更多的样板代码实现与上面相同的东西,以及单一使用C++.足够?

C++具有非常重要的值类型概念和基于范围的堆栈变量的确定性破坏.这导致了非常重要的习惯用语,如SBRM(范围限制资源管理,也称为RAII).

  • @PiMaster:你知道,`file.do_something()`足以指示我正在操作`file`.另外,如果你突然不想要任何try-catch块呢?或者如果你忘了包含一个?最好明确这些东西,你隐藏在晦涩的宏后面. (2认同)