c - 将宏扩展为多于一行

标签 c macros c-preprocessor

例如:

void foo();
void bar();
#define  CALC(a) \
do{ \
    if(a){ \
    foo();} \
    else{ \
    bar(); \
    } \
}while(false)

bool a = false;

void ree(){
   CALC(a);
}

上面的例子相当于:

#define  CALC (a)  if(a){ foo(); } else{ bar(); }

if(a){ foo(); } else{ bar(); }

我正在寻找一种将宏扩展到多于一行的可能性。例如:

void ree(){
    bool a = false;
    do{ 
        if(a)
        { 
           foo();
        } 
        else
        {
           bar(); 
        } 
    }while(false)

我需要它,因为我想在预处理器之后解析源代码,并且我需要将一些宏扩展到不止一行。 有可能吗?如何?

最佳答案

我不知道有什么方法可以让预处理器在宏扩展中插入换行符。我想象的唯一解决方案是在宏中插入特定的字符串,然后在预处理后,用换行符替换这些字符串。

#define  CALC(a) NEWLINE\
do{ NEWLINE\
  if(a){ NEWLINE\
  foo();} NEWLINE\
  else{ NEWLINE\
  bar(); NEWLINE\
  } NEWLINE\

bool a = false;

void ree(){
  CALC(a) 
}

如果您使用的是 Linux,则可以使用以下命令进行编译:

gcc -E t.c | sed -e 's/NEWLINE/\n/g' | sed -e 's/NEWLINE/\n/g' | gcc -x c -

关于c - 将宏扩展为多于一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28261800/

相关文章:

c++ - C/C++ 如何将宏参数扩展为引号之间的文本

macros - 宏可以扩展为模式组合吗?

C宏生成printf格式字符串

c - 在#if 指令之前强制宏定义

c# - 如何在 C# 中访问指向结构数据的编码指针?

我可以以某种方式在 ANSI C 中使用嵌套函数吗?

java - 枚举所有长度为 N 的 vector ,其中每个元素的值为 [0 ... K],所有元素的总和为 SUM

c - 二叉搜索树的中序遍历,显示一些错误

c++ - 如何使用宏来收集变量名?

c++ - 部分预处理 C 或 C++ 源文件?