C++预处理器

标签 c++ c-preprocessor

我想根据我在预处理器级别定义的变量类型有条件地包含函数(或特别是构造函数),例如

#define my_type double

并且在任何时候我都可以有条件地包含一个函数

#if my_type == double
void my_fct();
#endif

效果很好。但是,如果我想将模板化类型分配给 my_type,我该怎么做。以复杂的 double 为例,我会天真地想到

#if my_type == complex<double>

会起作用,但预处理器似乎将最后一个“>”解释为预处理器级别的运算符。 我看不到使用 typedef 的方法,因为我希望预处理器执行条件包含。 当然,我可以为我的整个类(class)制作模板并避免为此任务使用预处理器,但我目前非常不愿意这样做。此外,除了类型之外,总是可以定义另一个预处理器标志,但这看起来很脏。

最佳答案

#if my_type == double 不会测试你是否完成了#define my_type double。事实上,它永远是真的。

在预处理器算法中你只能使用整数常量表达式,所以你必须设置如下:

// from your makefile or whatever
#define MY_TYPE MY_DOUBLE

...

// in header file
#define MY_INT 3
#define MY_DOUBLE 4
#define MY_COMPLEX_DOUBLE 5

#if MY_TYPE == MY_DOUBLE
    typedef double my_type;
#elif MY_TYPE == MY_INT
    typedef int my_type;
#elif MY_TYPE == MY_COMPLEX_DOUBLE
    typedef complex<double> my_type;
#endif

关于C++预处理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26779711/

相关文章:

c++ - 如何在曲线上设置实心球体的动画

c++ - 纯虚拟运营商

c++ - 如何使用 protobuf 描述符读取枚举

c - 在glibc <= 2.23中,为什么在mutex_lock宏中使用 `0;`?

c++ - 为什么 OutputDebugString 为空

c++ - 用于稍后引用的 lambda 和函数的通用类型转换

c - 数组宏定义

c++ - C/C++ 预处理器 : extract every second variadic parameter

c - 使用 C 预处理器生成两个函数

C 宏构建函数