Наиболее нетехнический ответ, который я собрал из всех ссылок здесь и ссылки ссылок;), заключается в том, что однонаправленная косвенность macro(x) #x
приводит к строковому преобразованию имени введенного макроса, но при использовании двойных слоев он приводит к строковому преобразованию.значение введенного макроса.
#define valueOfPi 3
#define macroHlp(x) #x
#define macro(x) macroHlp(x)
#define myVarOneLayer "Apprx. value of pi = " macroHlp(valueOfPi)
#define myVarTwoLayers "Apprx. value of pi = " macro(valueOfPi)
printf(myVarOneLayer); // out: Apprx. value of pi = valueOfPi
printf(myVarOTwoLayers); // out: Apprx. value of pi = 3
То, что происходит при printf(myVarOneLayer)
printf(myVarOneLayer)
, расширяется до printf("Apprx. value of pi = " macroHlp(valueOfPi))
macroHlp(valueOfPi)
, пытаясь структурировать ввод,Сам вход не оценивается.Это единственная цель в жизни, чтобы взять ввод и зачеркнуть.Таким образом, он расширяется до "valueOfPi"
Итак, то, что происходит в printf(myVarTwoLayers)
printf(myVarTwoLayers)
, расширяется до printf("Apprx. value of pi = " macro(valueOfPi)
macro(valueOfPi)
не имеет операции строкового преобразования,то есть в его расширении нет #x
, но есть x
, поэтому он должен оценить x
и ввести значение в macroHlp
для строкового преобразования.Он расширяется до macroHlp(3)
, что, в свою очередь, приведет к строковому значению числа 3, так как он использует #x