C макро-аргумент 'устройство хранения данных'

Данный:

#define f(x, y) (x+y)
#define g(x, y) (x*y)
#define A 1, 2
#define B 2, 3

int main() {
  int a = f(A);
  int b = g(A);
  int c = f(B);
  int d = g(B);
}

который не работает,

как я могу заставить его работать? Основная идея состоит в том, что у меня есть один список аргументов, что я хочу передать двум другим макросам, не повторяя список длинных споров каждый раз.

Существует ли способ сделать это? [Вы можете изменить f и g; Вы даже можете изменить A и способ, которым я называю макросы. Единственные требования: 1) список arguemnt может только появиться однажды 2), он не может быть трудно кодирован... так, чтобы я мог назвать макросы с различными аргументами

Если Вы - решение, не вполне работает, но 'почти работает' (для Вас определение почти), я хотел бы услышать его также, возможно, я могу уклониться от него для работы.

Спасибо!

Править: f и g должен быть макросами. Они получают имена символа и управляют ими.

5
задан anon 20 February 2010 в 22:20
поделиться

4 ответа

EDIT: Версия, которая работает с немодифицированными A и B

#define f(x, y) (x+y) 
#define g(x, y) (x*y) 
#define A 1, 2 
#define B 2, 3

#define APPLY2(a, b) a b
#define APPLY(a, b) APPLY2(a, (b))

int main(int argc, char* argv[])
{
    int x= APPLY(f, A);
    int y= APPLY(f, B);
    int z= APPLY(g, A);
    int d= APPLY(g, B);

    return 0;
}
3
ответ дан 13 December 2019 в 19:26
поделиться

Если вы использовали C99, вы можете использовать синтаксис составного инициализатора , чтобы сделать это, передав несколько аргументов в виде единого массива:

#define f(a) (a[0]+a[1])
#define g(a) (a[0]*a[1])
#define A ((int[]) {1, 2})
#define B ((int[]) {2, 3})

​​GCC поддерживает этот составной буквальный синтаксис как в режиме C89, так и в режиме C ++.

4
ответ дан 13 December 2019 в 19:26
поделиться

Вы можете сделать следующее:

static int f(int x, int y) { return (x+y); }
static int g(int x, int y) { return (x*y); }
#define A 1, 2
#define B 2, 3

Если вы используете компилятор C, который поддерживает нестандартную директиву inline, вы можете устранить накладные расходы на вызов функции. А если бы вы использовали C++,

template<T> T f(T x, T y) { return (x+y); }
template<T> t g(T x, T y) { return (x*y); }
#define A 1, 2
#define B 2, 3

что работало бы примерно так же, как и ваше предполагаемое решение с макросами на C.

Если f и g must являются макросами, то нет никакого способа с помощью препроцессора Си передать макросам несколько аргументов без фактической запятой, появляющейся в месте вызова. Для этого вам придется добавить препроцессор уровня выше препроцессора Си.

4
ответ дан 13 December 2019 в 19:26
поделиться

Может быть, это то, что вам нужно:

#include<iostream>
using namespace std;

#define A 1, 2

template <typename T>
inline T f(T a, T b) { return a + b; }

int main()
{
    cout << f(A) << endl;
    return 0;
}
0
ответ дан 13 December 2019 в 19:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: