2012-06-19 6 views
6

Работа с модульной тестовой платформой, я столкнулся с ситуацией, в которой я хотел бы проверить макро аргументы. Проще говоря, я хотел бы расширить макрос FOO(x) таким образом, чтобы FOO(int) был бы short и FOO(anything_else) был бы long.Могу ли я условно заменить аргументы препроцессора?

С шаблонами C++, конечно, это не проблема. Но здесь мне нужна настоящая замена токена, а не только typedef. То есть FOO(char) FOO(char) i; должно быть действительным определением, равным long long i;.

+1

В новейшем стандарте C есть функция, где текст замены макроса может зависеть от типа выражения первого аргумента. Вы можете использовать это как строительный блок. –

+0

У вас есть взгляд на boost.pp, и если вы можете взломать somethign вместе с ним? – PlasmaHH

+1

@StefanMajewsky: Вы имеете в виду Generics, я верю? – dirkgently

ответ

0

то, что вы пытаетесь сделать, невозможно.

Макросы оцениваются препроцессором c, который, как следует из названия, запускается до запуска компилятора. Он не знает, каковы типы ваших символов.

Почему бы вам не создать класс для того типа, который бросает себя в нужное положение во время его вычисления компилятором.

+0

Меня не интересуют типы. Я знаю, что 'int' на этапе предварительной обработки - это всего лишь токен. Тем не менее, я хочу действовать условно на токен 'int'. – MSalters

3

Насколько я знаю, единственными подобными струне операциями, доступными в макросах C, являются вставки/конкатенации токенов (с использованием ##) и их строение (с использованием #).

Я уверен, что ближайший вы собираетесь получить предполагает перечисление возможностей, как так:

#define FOO(x) FOO__##x 
#define FOO__int short 
#define FOO__short long 
#define FOO__long long 
#define FOO__char long 
// ... for each type you want to replace 

Вдохновение от this question.

+0

(Edit # 2): если у вас ограниченный и известный набор «elses», можно перечислить их все. – flolo

+0

Да, я понял, что только сейчас, и очистил весь пост. – vergenzt

+0

Я не думаю, что могу перечислить свои аргументы впереди; Я могу получить 'FOO (AcmeWidgetUnitTest17)' :( – MSalters

Смежные вопросы