我试图在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);
或类似的东西。我想知道是否有办法做到这一点。感谢。
答案 0 :(得分:3)
使用
vec3 test = {0.0, 1.0, 0.4};
答案 1 :(得分:1)
使用类型名称作为构造函数,在C中最接近的是使用复合文字:
vec3 test = (vec3){ 0.0, 1.0, 0.4 };
这当然会抛弃功能体,因此您无法在设定值之外做任何事情(它也不会分配动态存储;您必须单独执行此操作)。它为您提供了一些非常好的额外功能(自动将字段置零,复杂结构更短等)。
C有多个名称空间(即多种方式来解释同一个单词),但是它们会被关键字标记出来(例如struct
或enum
),或者它们是&#39>主要"共享"空间。一旦你typedef
一个类型,你就把它放在"共享"空间,使用该名称的含义,因此它也可以被赋予一个功能。没有"名为func"空间或类似的东西。
你可以使用类似函数的宏来包装newvec3
:
#define vec3(...) newvec3(__VA_ARGS__)
这只会在函数调用上下文中将vec3
扩展为newvec3
,因此它允许在类型上下文中继续使用该名称。但是你可能不应该这样做 - 它并没有实际上为全局命名空间添加了第二个含义,它只是一个有时会触发的替代品,有时甚至没有#39 ; t(更糟糕的是,无论范围规则如何都会触发,这违反了普通类型和函数名称的C语义)。您必须在实际程序空间中有两个单独的名称;也可以说明一点。