#if 在 #define?
Posted
技术标签:
【中文标题】#if 在 #define?【英文标题】:#if inside #define? 【发布时间】:2011-12-08 08:10:18 【问题描述】:我正坐在一些通过#defines 生成大量代码的遗留代码上。现在我知道在#define
中不可能有#ifdef
,但是#if
可能吗?我想为特定类型添加一些专业化。 (无需进行重大更改,例如使用模板)。以下示例给了我神秘的错误,所以这不是方法:
#define MK_GET(type) \
type get_ ## type (int index) \
\
#if type == double \ <-- what i want to add
specialized code... \
#endif
...
\
MK_GET(double);
MK_GET(int);
MK_GET(string);
【问题讨论】:
#ifdef
只是表示#if defined(...)
的更短方式,所以我认为这是不可能的。
另见***.com/questions/2831934/…>。
【参考方案1】:
您可以使用模板来实现:
template<typename T>
struct getter
T operator()(int index)
// general code
;
template<>
struct getter<double>
T operator()(int index)
// specialized code
;
#define CAT(a, b) a ## b
#define MK_GET(type) type CAT(get_, type) (int index) getter<type>()(index)
【讨论】:
这个!通常,许多较大的#define 可以简化为模板和小定义。调试时你会感谢我的。 这是个好方法,谢谢。我从来没有想过我可以使用更小的模板 sn-pes 而不改变程序中的整个#define 结构:)【参考方案2】:预处理器是一个传递过程,因此您不能将宏定义放在宏定义中。唯一的方法是通过模板界面。
【讨论】:
【参考方案3】:为什么不这样写:
#if (type == double)
#define MK_GET some code
#else
#define MK_GET same code with changes
#endif
【讨论】:
因为每个模块只能有一个定义,并且不能为一个模块中的所有类型生成代码...【参考方案4】:#if
不能嵌套在 #define
中。为什么你想避免template
s 是更好的选择。它们是安全且“可编译的”(未经预处理)。
【讨论】:
是的。但我不想为了小修复而对运行生产代码进行太大的更改。 它们实际上可以...您只需要多次运行预处理器(实际上,每个嵌套级别运行一次)。这是一件愚蠢的事情,但它可以做到。例如,参见 2004 年国际混淆 c 代码竞赛 (ioccc.org/years.html#2004) 中的 vik2 条目,它与 Makefile 相关以上是关于#if 在 #define?的主要内容,如果未能解决你的问题,请参考以下文章