LINUX.ORG.RU
#include <stdlib.h>
#include <string.h>

#define par1 "10, 20"
#define sum(a, b) (a + b)
#define sum_str(str) sum(atoi(par1), atoi(strchr(par1, ',') + 1))

int main(void) {
   int c = sum_str(par1);
   printf("%d\n", c);
   return 0;
}
Nietzsche
()
Ответ на: комментарий от yurikoles

Говнокодненько.

Это я умею, поэтому стараюсь избегать макросы.

Nietzsche
()

Нет. Макропроцессор однопроходный.

Можно сделать так:

#define par1 10, 20

#define sum(a, b) (a + b)

#define CALL(fun, arg) fun ( arg )

void main(void) {
      printf("%d\n",CALL(sum, par1));
}

E ★★★
()
Ответ на: комментарий от yurikoles

кек

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define par1 "10, 20"
#define sum(a, b) (a + b)
//#define sum_str(str) sum(atoi(par1), atoi(strchr(par1, ',') + 1))
#define sum_str(str) sum(atoi(str), atoi(strchr(str, ',') + 1))

int main(void) {
   int c = sum_str(par1);
   printf("%d\n", c);
   return 0;
}
Nietzsche
()

нагуглилось интересное решение

#include <stdio.h>
#include <string.h>
#include <stdarg.h>

#define NUMARGS(...)  (sizeof((int[]){__VA_ARGS__})/sizeof(int))
#define SUM(...)  (sum(NUMARGS(__VA_ARGS__), __VA_ARGS__))

void sum(int numargs, ...);

int main(int argc, char *argv[]) {

    SUM(1);
    SUM(1, 2);
    SUM(1, 2, 3);
    SUM(1, 2, 3, 4);

    return 1;
}

void sum(int numargs, ...) {
    int     total = 0;
    va_list ap;

    printf("sum() called with %d params:", numargs);
    va_start(ap, numargs);
    while (numargs--)
        total += va_arg(ap, int);
    va_end(ap);

    printf(" %d\n", total);

    return;
}

у qt-creator сломался парсер-валидатор на этом коде

Nietzsche
()

Ещё вариант:

#define par1 10, 20

#define sum_(a, b) (a + b)
#define sum(...) sum_(__VA_ARGS__)

void main(void) {
    int c = sum(par1);
    int d = sum(10, 20);
}

xaizek ★★★★★
()

Забей на макросы, тем более препроцессор это как бы не си ::) Множественные параметры передавай через структуры или массивы.

Dron ★★★★★
()
Ответ на: комментарий от xaizek

Я до этого тоже додумался, но gcc5 умнее нас, он говорит то же самое.

yurikoles ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.