#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 中。为什么你想避免templates 是更好的选择。它们是安全且“可编译的”(未经预处理)。

【讨论】:

是的。但我不想为了小修复而对运行生产代码进行太大的更改。 它们实际上可以...您只需要多次运行预处理器(实际上,每个嵌套级别运行一次)。这是一件愚蠢的事情,但它可以做到。例如,参见 2004 年国际混淆 c 代码竞赛 (ioccc.org/years.html#2004) 中的 vik2 条目,它与 Makefile 相关

以上是关于#if 在 #define?的主要内容,如果未能解决你的问题,请参考以下文章

关于#if defined和#ifdef

#if,#endif,!defined的意义和用法

define定义的函数在if条件为假也能继续执行吗?

关于#if(defined(__WIN32__)的问题

在 C# 的 #if 中使用 #define 预处理器指令是不是有效

C#预处理器指令之#define/#undefine/#if/#elif/#else/#endif