【问题标题】:Macro conditional statements in CC 中的宏条件语句
【发布时间】:2017-04-18 06:50:44
【问题描述】:

是否可以在 C 中的宏函数内实现宏条件。像这样:

#define fun(x)
#if x==0
    fun1;
#else
    fun2;
#endif

#define fun1 // do something here
#define fun2 // do something else here

换句话说,预处理器根据参数值决定使用哪个宏。

fun(0) // fun1 is "preprocessed"
fun(1) // fun2 is "preprocessed"

我知道这个例子行不通,但我想知道是否有可能让它以某种方式工作?

M.

【问题讨论】:

  • 预处理器“修改”代码甚至在编译之前,所以在运行时肯定会解决。
  • 是的,我知道。但是x不是变量,它的值在编译之前就知道了。
  • BOOST_PP_IF(或 IIF)
  • 我认为这是不可能的。 C 预处理器的功能非常有限。我喜欢使用非常强大的 GNU m4。不幸的是,它的开发以某种方式卡住了,我不知道未来的版本(如果有的话)。使用 cpp,我只需像您一样定义一个值 x,但将条件指令放在宏之外。

标签: c macros conditional c-preprocessor


【解决方案1】:

您不能在预处理器指令中使用预处理器条件。例如,您可以在此处找到背景和解决方法:How to use #if inside #define in the C preprocessor?Is it possible for C preprocessor macros to contain preprocessor directives?

不过,您可以这样做:

#include <stdio.h>

#define CONCAT(i) fun ## i() /* For docs on this see here:
                                https://gcc.gnu.org/onlinedocs/cpp/Concatenation.html */
#define fun(i) CONCAT(i)

void fun1(void)
{
  puts(__FUNCTION__);
}

void fun2(void)
{
  puts(__FUNCTION__);
}


int main(void)
{
  fun(1);
  fun(2);
}

这将导致:

...

int main(void)
{
  fun1();
  fun2();
}

被传递给编译器并打印:

fun1
fun2

您可以通过以下方式进一步混淆您的代码:

... 

#define MYZERO 1
#define MYONE 2

int main(void)
{
  fun(MYZERO);
  fun(MYONE);
}

导致将相同的代码传递给编译器。

【讨论】:

  • 赞成并删除了我的答案,但(对其他人)解释为什么#if 'inside' #define 不起作用会很有用。
  • 很好的解决方案,但到底为什么你的令牌粘贴宏名为“stringify”? ;)
  • @Quentin: 胡,习惯和模式... :} 解决这个问题。
  • 亲爱的,谢谢您的回答。我还有一个关于宏的问题。有没有可能得到这样的东西——宏函数被称为macro_fun(7),输出是AD1。换句话说,我想评估7-6,并将结果连接为令牌,例如AD ## x-6。我知道这个例子不起作用,但我能不能让它起作用?
  • @Marko:我不知道预处理器会执行任何算术运算,会说将 3-2 评估为 1 等。也许您想阅读函数指针并在运行时在 C 中处理所有这些映射。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
  • 2011-07-18
  • 2019-03-25
  • 1970-01-01
相关资源
最近更新 更多