Если вы хотите придерживаться макросов, это краткое объяснение того, что происходит и как она может быть улучшена ,
#define PREFIX "pre_"
#define KEYWORD "keyword"
определяет два макроса, которые будут заменены их определением во время предварительной обработки.
#define BOTH PREFIX+KEYWORD
затем будет заменен
"pre_"+"keyword"
приводит к указателю того, явно не то, что вы хотите. Как и в C и C++, мы можем разделить C-строки, просто написав части рядом друг с другом без какого-либо оператора (они будут обрабатываться как один C-string литерал, а не конкатенация две C-строки):
"pre_" "keyword"
Так что вы хотите макрос быть
#define BOTH PREFIX KEYWORD
Если такие префиксы будут использоваться довольно часто в вашей программе, я лучше рекомендовать следующий метод:
#define PRE(x) "pre_" x
и "вызвать" макрос с
PRE("keyword")
, которая будет расширяться до "pre_" "keyword"
.
Теперь, если "keyword"
всегда будет время компиляции C-строка, которая может быть записана как лексем (без специальных символов), вы можете даже заставить его работать без кавычек:
#define PRE(x) "pre_" #x
#x
будет «конвертировать» токен x
в литерал C-строки. Затем, вы можете написать следующее:
PRE(keyword)
Обратите внимание, что это делается с помощью предварительной обработки, так keyword
может даже быть ключевым словом C/C++, и она будет иметь силу, как PRE(if)
.
Для полноты: Если вы хотите, чтобы результат еще маркер, вы можете выполнить конкатенацию лексем с помощью оператора препроцессоре ##
:
#define PRE(x) pre_ ## x
Затем PRE(keyword)
будет расширяться pre_keyword
.
http://gcc.gnu.org/onlinedocs/cpp/Concatenation.html – fritzone
'##' выполняет конкатенацию. –
@AlokSave нет в этом случае. – Pubby