【发布时间】:2014-01-13 21:05:20
【问题描述】:
来自How To Write Unmaintainable Code(结构的缩进):
我听说过的预处理器最有想象力的用途之一是在代码准备好编译之前需要通过 CPP 五次。通过巧妙地使用定义和 ifdef,混淆大师可以根据包含的次数使头文件声明不同的内容。当一个标头包含在另一个标头中时,这变得特别有趣。这是一个特别狡猾的例子:
#ifndef DONE
#ifdef TWICE
// put stuff here to declare 3rd time around
void g(char* str);
#define DONE
#else // TWICE
#ifdef ONCE
// put stuff here to declare 2nd time around
void g(void* str);
#define TWICE
#else // ONCE
// put stuff here to declare 1st time around
void g(std::string str);
#define ONCE
#endif // ONCE
#endif // TWICE
#endif // DONE
鉴于这段代码,我会期望这种行为:
- 将
#ifndef DONE评估为true,进入该区块 - 将
#ifdef TWICE评估为false - 分支到并输入
#else // TWICE - 将
#ifdef ONCE评估为false - 分支到并输入
#else // ONCE #define ONCE-
#endif三遍
为什么预处理器会多次“通过”?预处理器指令中的 if-else 是否不像标准 if-else 控制结构?在预处理器 if 语句中调用函数会导致完全重新评估吗?
【问题讨论】:
-
如果我在我正在编辑的头文件中看到该代码,我会射杀编写它的人,而且世界上没有陪审团会定我有罪。
-
这是一本关于混淆的讽刺指南,你期待什么? :)
-
说真的,这就像迪士尼的邪恶。 :)
-
至少他们有 cmets
标签: c++ obfuscation preprocessor-directive