C Preprocessor, Stringify the result of a macro

我们两清 提交于 2019-11-26 02:21:31

问题


I want to stringify the result of a macro expansion.

I\'ve tried with the following:

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

And TESTE gets expanded to: \"TEST\", while I\'m trying to get \"thisisatest\". I know this is the correct behavior of the preprocessor but can anyone help me with a way to achieve the other one?

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

回答1:


Like this:

#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);
}

The reason is that when macro arguments are substituted into the macro body, they are expanded unless they appear with the # or ## preprocessor operators in that macro. So, str (with value TEST in your code) isn't expanded in QUOTE, but it is expanded in EXPAND_AND_QUOTE.




回答2:


To clarify a bit more, essentially the preprocessor was made to execute another "stage". i.e :

1st case:

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

2nd case:

->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


来源:https://stackoverflow.com/questions/3419332/c-preprocessor-stringify-the-result-of-a-macro

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!