Имя переменной из аргумента макроса - PullRequest
24 голосов
/ 27 сентября 2011

Я хотел бы сделать что-то вроде этого:

class SomeClass { };

GENERATE_FUNTION(SomeClass)

Макрос GENERATE_FUNCTION Я бы хотел определить функцию, имя которой должно определяться аргументом макроса.В этом случае я бы хотел определить функцию func_SomeClass.Как это можно сделать?

Ответы [ 3 ]

31 голосов
/ 27 сентября 2011
#define GENERATE_FUNCTION(Argument) void func_##Argument(){ ... }

Больше информации здесь: http://en.wikipedia.org/wiki/C_preprocessor#Token_concatenation

5 голосов
/ 27 сентября 2011

Как все говорят, вы можете использовать вставку токенов для создания имени в макросе, поместив ## там, где необходимо объединить токены.

Если препроцессор поддерживает макросы с переменным числом, вы можете включить returnсписок типов и параметров тоже:

#define GENERATE_FUNCTION(RET,NAM,...) RET func_##NAM(__VA_ARGS__)

.. так, например:

GENERATE_FUNCTION(int,SomeClass,int val)

.. расширится до:

int func_SomeClass(int val)
4 голосов
/ 27 сентября 2011
#define GENERATE_FUNCTION(class_name) func_##class_name##
...