【发布时间】:2011-10-19 17:47:23
【问题描述】:
有时必须有条件地编译某些功能。例如,class Logger 仅在 WITH_LOGGING 宏为 #defined 时使用:
// Logger.cpp
#ifdef WITH_LOGGING
#include <Logger.h>
// several hundred lines
// of class Logger
// implementation
// follows
#endif
这不是很方便 - 除非读者滚动浏览文件,否则他无法确定匹配的 #endif 是否位于文件末尾,因此整个文件内容与 #ifdef 一起排除。我更喜欢这样的东西:
// Logger.cpp
#ifndef WITH_LOGGING
#GetOutOfThisFile
#endif
#include <Logger.h>
// several hundred lines
// of class Logger
// implementation
// follows
因此很明显,一旦WITH_LOGGING 不是#defined,编译器就会跳过文件的其余部分。
类似的东西在 C++ 中可能吗?
【问题讨论】:
-
你不能评论一下吗?
//If this is not defined nothing in here gets compiled似乎是我认为的重点。 -
这基本上就是包含守卫所做的事情,而且几乎没有人会因为在文件开头有一个
#ifdef而在文件末尾为几乎每个头文件都有一个#endif而感到困扰. -
这是(原因之一)文本编辑器有块折叠的原因。
-
我认为,如果您查看代码并没有立即意识到尽管最后没有 #endif,但它并未包含在内,这会更加令人困惑。
-
@Nicol Bolas:我并没有说没有人被包含守卫本身所困扰,我说没有人被文件开头的
#ifdef和#endif所困扰根据包含警卫的要求在文件末尾。据我所知,#pragma once的发明是为了让您不必为每个头文件都想出一个唯一的宏名称,而不是因为#ifdef/#endif的事情。
标签: c++ visual-c++ compiler-construction c-preprocessor