Почему эти блоки кода дают разные результаты?
Какой-то общий код:
#define PART1PART2 works
#define STRINGAFY0(s) #s
#define STRINGAFY1(s) STRINGAFY0(s)
case 1:
#define GLUE(a,b,c) a##b##c
STRINGAFY1(GLUE(PART1,PART2,*))
//yields
"PART1PART2*"
case 2:
#define GLUE(a,b) a##b##*
STRINGAFY1(GLUE(PART1,PART2))
//yields
"works*"
case 3:
#define GLUE(a,b) a##b
STRINGAFY1(GLUE(PART1,PART2*))
//yields
"PART1PART2*"
Я использую MSVC ++ из VS.net 2005 sp1
Редактировать: в настоящее время я считаю, что препроцессор работает так же при расширении макросов: Шаг 1: - взять тело - удалить все пробелы вокруг операторов ## - проанализировать строку, если найден идентификатор, соответствующий имени параметра: - если он находится рядом с оператором ##, заменитьИдентификатор с буквальным значением параметра (т. е. передаваемой строкой) - если он НЕ находится рядом с оператором ##, сначала запустите весь процесс объяснения значения параметра, а затем замените идентификатор на этот результат.(игнорируя строковый одиночный регистр '#') - удалите все операторы ##
Шаг 2: - возьмите эту результирующую строку и проанализируйте ее для любых макросов
сейчас, поскольку я считаю, чтово всех трех случаях должна получиться одна и та же результирующая строка:
PART1PART2 *
и, следовательно, после шага 2, должно привести к
работам *
, нопо крайней мере, должно привести к тому же.