【问题标题】:C Preprocessor, Stringify the result of a macroC预处理器,将宏的结果字符串化
【发布时间】:2011-03-26 01:30:01
【问题描述】:

我想对宏展开的结果进行字符串化。

我尝试了以下方法:

#define QUOTE(str) #str
#define TEST thisisatest
#define TESTE QUOTE(TEST)

并且 TESTE 扩展为:“TEST”,而我正在尝试获取“thisisatest”。我知道这是预处理器的正确行为,但任何人都可以帮助我实现另一种方法吗?

Using TESTE #TEST is not valid
Using TESTE QUOTE(thisisatest) is not what I'm trying to do

【问题讨论】:

标签: c-preprocessor stringification


【解决方案1】:

像这样:

#include <stdio.h>

#define QUOTE(str) #str
#define EXPAND_AND_QUOTE(str) QUOTE(str)
#define TEST thisisatest
#define TESTE EXPAND_AND_QUOTE(TEST)

int main() {
    printf(TESTE);
}

原因是当宏参数被替换到宏体中时,它们会被扩展除非它们出现在该宏中与# 或## 预处理器运算符一起出现。因此,str(在您的代码中具有值 TEST)不会在 QUOTE 中展开,而是在 EXPAND_AND_QUOTE 中展开。

【讨论】:

  • #define PE(BZL,YY) printf("ERROR - "#BZL": 结果: 0x%08x!", YY);做:int变量1=1; PE(测试1,变量1); --> 结果打印:错误 - 测试1:结果:0x1!
【解决方案2】:

为了更清楚一点,基本上预处理器是用来执行另一个“阶段”的。即:

第一种情况:

->TESTE
->QUOTE(TEST) # preprocessor encounters QUOTE 
 # first so it expands it *without expanding its argument* 
 # as the '#' symbol is used
->TEST

第二种情况:

->TESTE
->EXPAND_AND_QUOTE(TEST)
->QUOTE(thisisatest) 
  # after expanding EXPAND_AND_QUOTE
  # in the previous line
  # the preprocessor checked for more macros
  # to expand, it found TEST and expanded it
  # to 'thisisatest'
->thisisatest

【讨论】:

    猜你喜欢
    • 2012-06-29
    • 2019-06-21
    • 2012-07-21
    • 2017-02-25
    • 1970-01-01
    • 2017-09-18
    • 2015-10-09
    • 2011-11-28
    • 1970-01-01
    相关资源
    最近更新 更多