2011-12-17 51 views
0

周围使用C预处理器有点打后,我想了个办法有类似于控制结构的Pythonian的东西,像这样定义:定义一个类似于Python“with”语句的C宏有什么缺点?

#define with(var) for(int i##__LINE__=0;i##__LINE__<1;)for(var;i##__LINE__<1;++i##__LINE__) 

使用范例:

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

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

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

这是否有任何缺点?如果我足够混淆迭代变量,那么几乎没有发生名称冲突的机会,它仅使用标准预处理器功能,但似乎没有任何回火的可能性,并且很容易理解。

它几乎看起来太好了,是不是真的 - 有什么理由,这是不是在任何地方都使用?

+8

如果您想编写Python,请这样做。 – Xeo 2011-12-17 03:26:45

+0

每个人都在努力完全消除对预处理器的需求,并且您正在尝试广泛地使用它,做得好:)(我想我在Obfuscated C比赛中看到了类似的东西。) – ScarletAmaranth 2011-12-17 03:29:18

回答

4

它在精神上类似于用C编写的原始Bourne shell中使用的宏。它们旨在提供类似于Algol 68的语法,该语言显然是Bourne的首选语言。

http://minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/sh/mac.h一个小例子:

#define IF if(
#define THEN ){ 
#define ELSE } else { 
#define ELIF } else if ( 
#define FI ;} 

结果往往是代码是难以阅读无论是C程序员(谁与您的宏以及C本身的语法熟悉)或者Algol 68,或者你的Python程序员。 (a)意识到with()是一个宏(宏通常被赋予全部大写的名称),(b)跟踪(0),如果我读了一个使用你的宏的C++程序,我不能真正理解它在做什么,(a)认识到with()是宏(c)解密扩展宏所产生的相当奇怪的C代码。假设我不陷入陷阱,认为这是一个特定于编译器的扩展,或者C具有我不知道的with声明。

或者,如果我碰巧知道Python的with语句,然后我还需要(一)意识到你with()宏是专门模仿一个Python with声明,以及(b)相信你能得到它的权利。

几年前,我认为这一点:

#define ever ;; 
... 

for (ever) { ... } 

是非常聪明的。我仍然认为这很聪明;但我不再认为聪明是件好事。

6

有没有什么理由,这是没有用处?

是的,C++是不是Python的,如果我理解正确的代码,这样做完全一样的:

{ 
    FileClass file("test.txt"); 
    printf("%s\n", file.readlines().c_str()); 
} 

那么,有什么缺点?不自然的语法,用于代码混淆的预处理器的用法,用更多样板代码实现与上述相同的功能,以及单独使用C++。足够?

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

+0

使用with control语句使得文件是该事情正在更加明确地进行。此外,还可以在宏中增加一个try语句,并添加catch语句来制作一个美化的短文。 – ConsciousCode 2011-12-17 03:44:33

+2

@PiMaster:你知道,`file.do_something()`对我来说足够了``file`正在被操作。另外,如果你突然不想尝试任何try-catch块呢?或者,如果你忘记包含一个?最好明确这些东西,你隐藏在隐藏的宏中。 – Xeo 2011-12-17 03:49:19

0

这个明显的缺点是,没有人能够阅读你的意大利面条混杂的Python-in-C++代码。所以保持这个代码的好运气。

1

它几乎看起来太好了,是真的 - 有没有什么理由不是 到处使用?

当然,这是一个非常适合你的好结构,但团队中其他人呢?那么你在六个月内的未来会如何呢?它无法记住你写的那个可爱的宏?

简而言之,像这样的句法体操在家里是很棒的练习,但在协作环境中很糟糕,甚至在未来只能维护一些代码。坚持最佳实践,您的代码将更易于维护和理解。

这并不是说你不应该在家里做这种事情。做你喜欢的事情,保持你的大脑灵活。但是不要在生产中使用你的热身练习!

1

这真的是“带”吗? Python中“with”的一大优点是它可以与上下文管理器协同工作,后者负责在“with”语句中自动关闭/释放/解锁/取消分配变量。在C++中,有这样的标准方法。例如,auto_ptr将负责自动删除使用新分配的指针。在重新发明它们之前,先学习这些标准习语。

相关问题