#define中的换行符和单双引号

时间:2019-09-23 16:51:05

标签: c gcc c-preprocessor

我正在尝试制作一个程序,该程序需要这样的东西:

timeit.timeit("a1()", globals=globals())

我希望输出为

#define TEST "HELLO #define TEST2 WORLD\n" ... printf(TEST TEST2); ...

但是该代码不起作用。

是否可以在C语言中包含这样的换行符和双引号?

2 个答案:

答案 0 :(得分:4)

使用Send-MailMessage整理宏以使报价转义给您

\"

并产生输出#include <stdio.h> #define TEST "\"HELLO " #define TEST2 "WORLD\"\n" int main(void) { printf(TEST TEST2); }

答案 1 :(得分:3)

你不能那样做;宏的替换序列由完整的标记组成。宏在令牌级别而不是字符级别工作。您的示例包含未终止的字符串文字标记。

在宏替换序列中可以使用一个##运算符来填充令牌,但是##的输入不能是令牌片段。

但是,在C语法中,相邻的字符串文字标记被组合为单个字符串文字对象。例如"A" "B""AB"的含义相同。

因此,如果我们允许以令牌HELLOWORLD作为输入,那么我们将使用宏来构造"HELLO WORLD\n",如下所示:

#include <stdio.h>

#define XMAC(A, B) #A " " #B "\n"
#define MAC(A, B) XMAC(A, B)

#define TEST HELLO
#define TEST2 WORLD

int main(void)
{    
  printf("%s", MAC(TEST, TEST2));
  return 0;
}

当涉及到C预处理程序时,您实际上必须关注您的主要目标(例如在程序组织方面实现总体改进),并准备好调整有关如何实现它的要求的细节。 ,而不是坚持某些非常具体的方法。