Как определить макросы? - PullRequest
       24

Как определить макросы?

0 голосов
/ 01 февраля 2012

У меня есть radius2 = x*x +y*y + z*z.

Я хочу переключить 3D в 2D (т.е. radius2 = x*x + y*y) без удаления z * z.

Я попытался определить макрос

1.h [заголовочный файл для переключения 2D / 3D]

 #define DIMENSIONS 2 //or, 3

2.h

#if DIMENSIONS == 2
#define EXPAND(a,b,c) a, b
#endif
#if DIMENSIONS == 3
#define EXPAND(a,b,c) a, b, c
#endif

main.c

#include "stdio.h"
#include "1.h"
#include "2.h"

main(){
int x, y, z, radius2;
x = 2;
y = 3; 
z = 4;
radius2 = EXPAND(x*x, +y*y, +z*z);
printf("%d", radius2);
}

При компиляции я получаю эту ошибку:

Undefined symbols:
 "_EXPAND", referenced from:
     _main in ccsC4tfr.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

Ответы [ 2 ]

2 голосов
/ 01 февраля 2012
Ответ

@ mmodahl объясняет, почему ваше определение EXPAND не найдено.

Кстати, было бы проще выполнить вычисления в макросе:

#if DIMENSIONS == 2
#define COMPUTE_RADIUS(a,b,c) ((a)*(a) + (b)*(b))
#elif DIMENSIONS == 3
#define COMPUTE_RADIUS(a,b,c) ((a)*(a) + (b)*(b) + (c)*(c))
#endif

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

0 голосов
/ 01 февраля 2012
//1.h
#define DIMENSIONS_2
...
//2.h
#ifdef DIMENSIONS_2
#define EXPAND(a,b,c) a, b
#else
#define EXPAND(a,b,c) a, b, c
#endif

Поскольку вам нужно переключаться только между двумя случаями, просто define макрос с соответствующим именем, как показано.Сравнение, показанное в вашем коде, не работает на этапе предварительной обработки.

...