Данный:
#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 должен быть макросами. Они получают имена символа и управляют ими.
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;
}
Если вы использовали 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 ++.
Вы можете сделать следующее:
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 являются макросами, то нет никакого способа с помощью препроцессора Си передать макросам несколько аргументов без фактической запятой, появляющейся в месте вызова. Для этого вам придется добавить препроцессор уровня выше препроцессора Си.
Может быть, это то, что вам нужно:
#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;
}