2012-06-19 4 views
0

Я определил следующую структуру в C:С макро с {}

typedef struct point{ 
    float x; 
    float y; 
    float z; 
} Point; 
typedef Point Vector; 

и следующий макрос:

#define sub(p1,p2)  {p1.x-p2.x,p1.y-p2.y,p1.z-p2.z} 

, который используется следующим образом:

void fun(Point p0, Point p1){ 
    Vector u; 
    u=sub(p1,p0); 
} 

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

error: expected expression before '{' token 

Поэтому в основном я просто хочу, чтобы получить то же самое, как:

struct point u={p1.x-p0.x,p1.y-p0.y,p1.z-p0.z} 

Я действительно понятия не имею, что я делаю неправильно ... Спасибо.

[EDIT] включил некоторые дополнительные функции, чтобы вы могли видеть, где я думаю, что моя ошибка была. Не инициализируется с объявлением переменной, потому что после изменения

Vector u; 
u=sub(p1,p0); 

в

Vector u=sub(p1,p0); 

Это работает, но я до сих пор не понимаю, почему.

+0

показать весь код, ошибка, вероятно, не в том фрагменте, который вы показываете – ouah

+0

Вы пытались скомпилировать его без макроса, например. 'Вектор u = {p1.x-p0.x, p1.y-p0.y, p1.z-p0.z};'? –

+0

yes Я скомпилирован без макроса, и он работает, и я использую gcc –

ответ

8

Это не имеет ничего общего с макросом: проблема будет сохраняться, даже если вы разворачиваете этот макрос вручную. Причина, по которой это происходит, заключается в том, что список инициализаторов в присваивании должен состоять из постоянных выражений, поэтому p1.x не допускается.

Если вы используете C99, изменить макрос использовать compound literal, как это:

#define sub(p1,p2)  (Vector){p1.x-p2.x,p1.y-p2.y,p1.z-p2.z} 

Это позволит использовать макрос в назначениях, а также в инициализаторах.

+0

Я расширил, и это сработало ... –

+3

Я думаю, что это расширение GCC, которое позволяет использовать не постоянные инициализаторы и [он компилирует] (http://ideone.com/Yero1) в GCC, но это может быть не переносным способом сделать это; таким образом, согласны с вашим предложением –

+0

Когда вы говорите, что он не переносимый, вы имеете в виду, что у компиляторов правильно? –

Смежные вопросы