Составьте следующий тест. cpp
# define TopLevelProject X11
#define Concat3(a,b,c) a/**/b/**/c
# define ProjectRulesFile Concat3(<,TopLevelProject,.rules>)
#include ProjectRulesFile
cpp -I. test. cpp
Ожидается, что будет сгенерирован оператор include
# 1 "test.cpp"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "test.cpp"
# 10 "test.cpp"
# 1 "./X11.rules" 1
# 11 "test.cpp" 2
# 1 "./X11.rules" 1
# 15 "test.cpp" 2
Обратите внимание, что строка "./ X11 .rules " действительно выводится
Однако яблочный clang cpp дает результат
# 1 "test.cpp"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 361 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "test.cpp" 2
test.cpp:7:10: fatal error: ' X11 .rules' file not found
#include ProjectRulesFile
^~~~~~~~~~~~~~~~
test.cpp:5:35: note: expanded from macro 'ProjectRulesFile'
# define ProjectRulesFile Concat3(<,TopLevelProject,.rules>)
~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
test.cpp:3:24: note: expanded from macro 'Concat3'
#define Concat3(a,b,c) a/**/b/**/c
^~~~~~~~~~~
1 error generated.
Обратите внимание на искаженное имя файла 'X11 .rules'
Apple cpp вставляет пробел перед первым параметром и еще один между вторым и третьим параметрами макроса Concat3.
Все версии g cc, clang и инструментов msdev выполните правильную замену текста.
Но
Все версии cpp от Apple, например, распространяемые xcode, имеют эту ошибку.
Есть ли какая-то схема конкатенации параметров макроса, которую я мог бы использовать для написания макроса Concat3 , чтобы он работал под cpp?
Спасибо