是否可以在宏中设置预处理器条件?

时间:2011-02-27 16:52:49

标签: c++ conditional c-preprocessor substitution

我处于这样的位置,这种设计将大大提高我的代码的清晰度和维护需求。

我正在寻找的是这样的:

#define MY_MACRO(arg) #if (arg)>0 cout<<((arg)*5.0)<<endl; #else cout<<((arg)/5.0)<<endl; #endif

这个想法在这里:
预处理器根据宏参数的编译时(常量)值替换不同的代码行。当然,我知道这种语法不起作用,因为#被视为string-ize运算符而不是标准#if,但我认为这证明了预处理器功能我正在努力实现。

我知道我可以在其中放置一个标准的if语句,并且将留下编译器/运行时来检查该值。但是,当arg始终传递一个常量值时,这对于应用程序来说是不必要的工作,例如10.8-12.5只需要在编译时进行评估。

这个数字运算应用程序的性能需求要求尽可能消除所有不必要的运行时条件,并且已经使用了许多常量值和宏(代替变量和函数)来实现这一点。在不必将预处理器代码与真实if条件混合的情况下继续这种趋势的能力将使这更加清晰 - 当然,代码清洁是使用宏时最大的问题之一,尤其是在这个级别

2 个答案:

答案 0 :(得分:7)

据我所知,你的宏内部不能有#if(或类似的东西)。 但是,如果在编译时已知条件,则可以安全地使用普通if语句。编译器将对其进行优化(假设您已启用优化)。

它被称为“Dead code elimination

答案 1 :(得分:5)

简单,使用真正的C ++:

template <bool B> void foo_impl       (int arg) { cout << arg*5.0 << endl; }
template < >      void foo_impl<false>(int arg) { cout << arg/5.0 << endl; }
template <int I>  void foo            ( )       { foo_impl< (I>0) >(I); }  
相关问题