Использование макросов для обобщения кода для вызовов функций

Я пишу код C, который требует от меня использования нескольких вызовов функций одного и того же определения, которые отличаются только одним символом. Есть ли способ, которым я могу создать функцию макроса, которая принимает, скажем, число и может вставлять эти вызовы в мой код для меня, где я вызываю макрос, учитывая, что я знаю числа во время компиляции:

i.e.

#define call_pin_macro(X)
    enable_pin#X();
    do_thing_pin#X();
    do_other_thing_pin#X();
            .
            .
void pin_function(void){
    call_pin_macro(1);
    call_pin_macro(2);
    call_pin_macro(3);
}

Вместо:

void pin_function(void){
     enable_pin1();
     do_thing_pin1();
     do_other_thing_pin1();
     enable_pin2();
     do_thing_pin2();
     do_other_thing_pin2();
     enable_pin3();
     do_thing_pin3();
     do_other_thing_pin3();

}

В качестве примечания я просмотрел строку (отсюда включенные # X) в gcc, однако я не могу получить приведенный выше код для компиляции, из-за чего получаю сообщение об ошибке «ошибка: за '#' не следует параметр макроса». И поэтому кажется, что это не совсем та функциональность, которая мне нужна. Заранее спасибо.


person ss2_d    schedule 11.03.2015    source источник
comment
Примечание: макрос, написанный на нескольких строках, требует '\' для объединения строк. Итак, #define call_pin_macro(X)\enable_pin#X();\...   -  person Paul Ogilvie    schedule 11.03.2015


Ответы (1)


В gcc это можно сделать так:

#define call_pin_macro(X)   \
    enable_pin##X();           \
    do_thing_pin##X();         \
    do_other_thing_pin##X();

Двойной хеш — это оператор сцепления макросов. Вы не хотите использовать stringify, потому что это поместит его в кавычки.

Обратная косая черта позволяет продолжить макрос на несколько строк.

person samgak    schedule 11.03.2015
comment
Имеет ли двойной ## особое (то есть уникальное) значение для препроцессора, аналогичное одиночному символу #, или здесь используется какая-то другая интуиция кодирования, использующая два символа # последовательно. - person ss2_d; 11.03.2015
comment
у него есть собственное значение: конкатенация - person samgak; 11.03.2015