Есть ли способ передать несколько значений в функцию макроса как одно определенное значение макроса в C?

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

#define STATUS_LED B,7

Затем я хочу передать определение этого вывода функции выше:

CMBset_out(STATUS_LED);

Я не знаю, как к этому подойти - MY_PIN в правильном формате для замены на этапе предварительной компиляции.

#define CMBsbi(port, pin) (PORT##port) |= (1<<pin)
#define CMBset_out(port,pin) (DDR##port) |= (1<<pin)
// define pins 
#define STATUS_LED B,7

Затем я хочу передать определение этого вывода функции выше (hw_init_states() объявлено в том же заголовочном файле, который вызывается из основного файла C):

// runtime initialization
void hw_init_states(){
#ifdef STATUS_LED
    CMBset_out(STATUS_LED);
#endif
}

Но я получаю ошибку компиляции:

Error   1   macro "CMBset_out" requires 2 arguments, but only 1 given   GENET_HW_DEF.h  68  23  Compass IO_proto

Ответ 1

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

Он должен работать с любым компилятором c99 (или лучше):

#define CMBset_out_X(port,pin) (DDR##port) |= (1<<pin)
#define CMBset_out(...) CMBset_out_X(__VA_ARGS__)

#define STATUS_LED B,7
CMBset_out(STATUS_LED)
CMBset_out(B, 7)

Ответ 2

Это возможно, но вам нужен другой уровень макросов для расширения аргумента:

#define CMBset_out_X(port,pin) (DDR##port) |= (1<<pin)
#define CMBset_out(x) CMBset_out_X(x)

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