alm*_*now 41 stringification c-preprocessor
我想将宏扩展的结果字符串化.
我试过以下内容:
#define QUOTE(str) #str
#define TEST thisisatest
#define TESTE QUOTE(TEST)
Run Code Online (Sandbox Code Playgroud)
并且TESTE扩展到:"TEST",而我正试图获得"thisisatest".我知道这是预处理器的正确行为,但任何人都可以帮我找到另一种方法吗?
Using TESTE #TEST is not valid
Using TESTE QUOTE(thisisatest) is not what I'm trying to do
Run Code Online (Sandbox Code Playgroud)
Ste*_*sop 74
像这样:
#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);
}
Run Code Online (Sandbox Code Playgroud)
原因是当宏参数被替换为宏体时,它们将被扩展,除非它们与该宏中的#或##预处理器运算符一起出现.因此,str(TEST代码中的值)不会扩展QUOTE,但会扩展EXPAND_AND_QUOTE.
pra*_*km 15
为了澄清一点,基本上预处理器是为了执行另一个"阶段".即:
第一例:
->TESTE
->QUOTE(TEST) # preprocessor encounters QUOTE
# first so it expands it *without expanding its argument*
# as the '#' symbol is used
->TEST
Run Code Online (Sandbox Code Playgroud)
第二个案例:
->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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
23145 次 |
| 最近记录: |