Как избежать подчеркивания в токене препроцессора C?

StackOverflow https://stackoverflow.com/questions/141878

  •  02-07-2019
  •  | 
  •  

Вопрос

Предполагается, что следующий фрагмент должен принимать значение PROJECT (определенное в Makefile) и создавать имя включаемого файла.Например, если PROJECT=classifier , то в конце он должен сгенерировать classifier_ir.h для PROJECTINCSTR

Я нахожу, что этот код работает до тех пор, пока я не пытаюсь использовать подчеркивание в суффиксе.Однако использование подчеркивания не является необязательным - наша кодовая база использует их повсюду.Я могу обойти это, потому что существует ограниченное количество значений для PROJECT, но я хотел бы знать, как заставить следующий фрагмент текста действительно работать с подчеркиванием.Можно ли этого избежать?

#define PROJECT classifier

#define QMAKESTR(x) #x
#define MAKESTR(x) QMAKESTR(x)
#define MAKEINC(x) x ## _ir.h
#define PROJECTINC MAKEINC(PROJECT)
#define PROJECTINCSTR MAKESTR(PROJECTINC)

#include PROJECTINCSTR

Редактировать:Компилятор должен попытаться включить classifier_ir.h, а не PROJECT_ir.h .

Это было полезно?

Решение

#define QMAKESTR(x) #x
#define MAKESTR(x) QMAKESTR(x)
#define SMASH(x,y) x##y
#define MAKEINC(x) SMASH(x,_ir.h)
#define PROJECTINC MAKEINC(PROJECT)
#define PROJECTINCSTR MAKESTR(PROJECTINC)

Другие советы

Это работает для меня:

#define QMAKESTR(x) #x
#define MAKESTR(x) QMAKESTR(x)
#define MAKEINC(x) x ## _ir.h
#define PROJECTINC(x) MAKEINC(x)
#define PROJECTINCSTR MAKESTR(PROJECTINC(PROJECT))

#include PROJECTINCSTR

Этот пример barebone работает с gcc (v4.1.2) и пытается включить "PROJECT_ir.h"

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top