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

Gif*_*guy 3 c++ conditional substitution c-preprocessor

我的位置可以大大提高我的代码的清晰度和维护需求.

我正在寻找的是这样的:

#define MY_MACRO(arg) #if (arg)>0 cout<<((arg)*5.0)<<endl; #else cout<<((arg)/5.0)<<endl; #endif
Run Code Online (Sandbox Code Playgroud)

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

我知道我可以if在那里放一个标准语句,然后编译器/运行时将检查该值.但是这对于应用程序来说是不必要的工作,当arg总是传递一个常量值时,10.8或者-12.5只需要在编译时进行评估.

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

Cyg*_*sX1 7

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

它被称为" 死代码消除 "

  • 死代码仍然必须编译.这可能是像`if(i> 0){int foo [i]; } else {int foo [1-i]; }`.模板是另一种选择. (3认同)

MSa*_*ers 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); }  
Run Code Online (Sandbox Code Playgroud)