C vec3 Struct实现

时间:2015-03-25 18:01:52

标签: c

我试图在C中实现一个vec3结构。我有它的工作,但不一定是我想要的。我目前的代码如下。

typedef struct vec3 {
    float x, y, z;
} vec3;

struct vec3 newvec3(float x, float y, float z) {
    struct vec3 *values = malloc(sizeof(struct vec3));

    values->x = x;
    values->y = y;
    values->z = z;
    return *values;
}

为了声明我必须写的结构。

vec3 test = newvec3(0.0, 1.0, 0.4);

我想要的是。

vec3 test = vec3(0.0, 1.0, 0.4);

或类似的东西。我想知道是否有办法做到这一点。感谢。

2 个答案:

答案 0 :(得分:3)

使用

vec3 test = {0.0, 1.0, 0.4};

答案 1 :(得分:1)

使用类型名称作为构造函数,在C中最接近的是使用复合文字:

vec3 test = (vec3){ 0.0, 1.0, 0.4 };

这当然会抛弃功能体,因此您无法在设定值之外做任何事情(它也不会分配动态存储;您必须单独执行此操作)。它为您提供了一些非常好的额外功能(自动将字段置零,复杂结构更短等)。

C有多个名称空间(即多种方式来解释同一个单词),但是它们会被关键字标记出来(例如structenum),或者它们是&#39>主要"共享"空间。一旦你typedef一个类型,你就把它放在"共享"空间,使用该名称的含义,因此它也可以被赋予一个功能。没有"名为func"空间或类似的东西。

可以使用类似函数的宏来包装newvec3

#define vec3(...) newvec3(__VA_ARGS__)

这只会在函数调用上下文中将vec3扩展为newvec3,因此它允许在类型上下文中继续使用该名称。但是你可能不应该这样做 - 它并没有实际上为全局命名空间添加了第二个含义,它只是一个有时会触发的替代品,有时甚至没有#39 ; t(更糟糕的是,无论范围规则如何都会触发,这违反了普通类型和函数名称的C语义)。您必须在实际程序空间中有两个单独的名称;也可以说明一点。