аргументы макроса не имеют типа.Вы хотите:
#define vectorSub(c,v) {(v)->x * (c), (v)->y * (c), (v)->z * (c) }
Это лучший эквивалент, если кто-то не называет ваш макрос следующим образом:
vector v2 = vectorSub(i++,v);
, что является распространенной проблемой с макросами, использующими свои параметры более одного раза, поскольку он будет расширятьсяas:
{(v)->x * (i++), (v)->y * (i++), (v)->z * (i++) }
Полный автономный пример компиляции:
typedef struct {
float x,y,z;
} vector;
#define vectorSub(c,v) {(v)->x * (c), (v)->y * (c), (v)->z * (c) }
vector foo()
{
vector v = {0,3,4};
vector v2 = vectorSub(12,&v);
return v2;
}
обратите внимание, что хороший компилятор может / будет встроить такие короткие функции, как ваш оригинальный vectorScale
, особенно еслиключевое слово inline
используется для отправки подсказки компилятору (компилятор не обязательно соответствует), а функция находится в заголовочном файле, поэтому макросы здесь не лучший выбор, особенно потому, что они не включают трюки с макросами, такие каквставка токенов или цепочка.