Макроаргумент C 'хранение' - PullRequest
       13

Макроаргумент C 'хранение'

5 голосов
/ 21 февраля 2010

Дано:

#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) список аргументов может появиться только один раз 2) он не может быть жестко запрограммирован ... чтобы я мог вызывать макросы с разными аргументами

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

Спасибо!

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

Ответы [ 4 ]

4 голосов
/ 21 февраля 2010

Если вы использовали 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 голосов
/ 21 февраля 2010

Вы можете сделать это:

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 должны быть макросами, препроцессор C не может передать несколько аргументов макросам без фактической запятой, появляющейся на сайте вызова. Для этого вам нужно добавить уровень препроцессора выше препроцессора C.

3 голосов
/ 21 февраля 2010

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;
}
0 голосов
/ 21 февраля 2010

Может быть, это то, что вы хотите:

#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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...