Можно ли обрабатывать каждый элемент макроса variadi c во время компиляции в C? - PullRequest
5 голосов
/ 02 февраля 2020

Возможно ли как-то заархивировать следующее? Я использую г cc.

#define foo(argCount, ...)\
    FOR_EACH_IN_VA_ARGS_(argCount, element, __VA_ARGS__)\
    {\
        printf("%u", sizeof(element));\
    }

Спасибо за ваши ответы.

Ответы [ 2 ]

3 голосов
/ 02 февраля 2020

Этот ответ показывает, как вы можете сделать макрос foreach в препроцессоре: { ссылка }

Применительно к вашему примеру аргумент argCount не требуется и версия с состоянием на самом деле это невозможно, потому что препроцессор не имеет изменяемого состояния вне того, что определено, а что нет, но вы можете иметь версию apply-macro-to-each:

#include "foreach.h" //generated header implementing BX_foreachc
#include <stdio.h>
#define prsz(X) printf("%zu\n", sizeof(X))
#define foo(...) BX_foreach(;,prsz,__VA_ARGS__)

int main(void)
{
    foo(char,short,int,long, long long);
    //expands to  printf("%zu\n", sizeof(char)) ; printf("%zu\n", sizeof(short)) ; printf("%zu\n", sizeof(int)) ; printf("%zu\n", sizeof(long)) ; printf("%zu\n", sizeof(long long));

 }

(полагается на заголовок foreach.h, сгенерированный сценарием, опубликованным в связанном ответе)

Гораздо проще сделать это с помощью макроса с параметризованным макросом-списком:

#include <stdio.h>
#define PRSZ(X) printf("%zu\n", sizeof(X));
#define LIST(_) _(char) _(short) _(int) _(long) _(long long)
int main(void)
{
    LIST(PRSZ)
}

Любой метод портативный.

0 голосов
/ 02 февраля 2020

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...