Вызов имени функции, созданной с помощью __LINE__ - PullRequest
0 голосов
/ 02 июля 2011

Предположим, я построил уникальное тело функции из кода ниже:

#define TOKENPASTE(x, y) x ## y
#define TOKENPASTE2(x, y) TOKENPASTE(x, y)
#define UNIQUE static void TOKENPASTE2(Unique_, __LINE__)(void)

Как я могу вызвать эту функцию?

Определение макроса взято из: Создание макроса C с помощью## и __LINE__ (объединение токенов с макросом позиционирования) .

Ответы [ 2 ]

1 голос
/ 02 июля 2011

Нет. Вы не можете . Потому что вы не можете определить имя функции во время выполнения. (то есть, чтобы позвонить Unique_22 или Unique_44. Однако вы можете определенно позвонить Unique<22> или Unique<44>)

Так что вместо этого вы можете использовать template решение. Объявите Unique как показано ниже:

template<unsigned int LINE> void Unique ();

И #define такой макрос:

#define UNIQUE template<> Unique<__LINE__>() {}

Я советую использовать __COUNTER__ вместо __LINE__, если ваш компилятор поддерживает это. [Примечание: это означает, что в любой строке вы можете вызвать UNIQUE только один раз, а также макрос должен быть развернут в глобальном или namespace объеме (не внутри метода).]

0 голосов
/ 02 июля 2011

После замены кода кодом, приведенным в ответе на вопрос SO, который вы указали, чтобы он работал, ... вы не можете напрямую вызывать эту функцию, так как не можете точно знать ее имя, это изменитсяесли код изменится.Я понятия не имею, как это может быть полезно в коде (может быть, сканирование объекта на наличие символа, подобного Unique_[0-9]+? В любом случае, это будет косвенное использование, в коде, как сказано, вы не можете использовать его надежно.

...