GObjects 中的常量正确性
const correctness in GObjects
目前我正在 trying/invesigating 创建一个基于 glib/gobject 库的库。所以我试图制作一个 GObject 风格的数学向量。向量可以加在一起,所以我试图用伪代码实现的是:v1 = [1, 2, 3, 4]
、v2 = [1, 2, 3, 4]
和 v_add_result = v1 + v2
。如您所见,应该为结果分配一个新向量,并且对于此操作 v1 和 v2 不会更改,因此,我希望这些 const 合格。
来自我的-vector.h:
#define MY_TYPE_VECTOR (my_vector_get_type())
G_DECLARE_DERIVABLE_TYPE(MyVector, my_vector, MY, VECTOR, GObject)
struct _MyVectorClass
{
GObjectClass parent_class;
MyVector* (*add) (const MyVector* self, const MyVector* other);
void (*add_is)(MyVector* self, const MyVector* other);
MyVector* (*sub) (const MyVector* self, const MyVector* other);
void (*sub_is)(MyVector* self, const MyVector* other);
};
MyVector* my_vector_new();
MyVector* my_vector_new_vals(double v1, double v2, double v3, double v4);
// This is the function which in theory could be implemented with const MyVectors
MyVector* my_vector_add(const MyVector* self, const MyVector* rhs);
然后为了实现加法,我有一个 public 加法函数,它检查其输入是否是有效的 MyVector 实例。但是,如果我尝试检查实例是否是有效的 MyVector 实例,我会收到一条关于宏的警告,该宏应该根据 gobject 系统检查指针是否实际指向有效的 MyVector 实例。
以及来自 my-vector.c:
的片段
MyVector*
my_vector_add(const MyVector* self, const MyVector* other)
{
g_return_if_fail(MY_IS_VECTOR(self));
g_return_if_fail(MY_IS_VECTOR(other));
const MyVectorClass* klass = MY_VECTOR_GET_CLASS(self);
g_return_if_fail(klass->add != NULL);
return klass->add(self, other);
}
我收到的编译器警告是:
In file included from /usr/lib/x86_64-linux-gnu/glib-2.0/include/glibconfig.h:9:0,
from /usr/include/glib-2.0/glib/gtypes.h:32,
from /usr/include/glib-2.0/glib/galloca.h:32,
from /usr/include/glib-2.0/glib.h:30,
from /usr/include/glib-2.0/gobject/gbinding.h:28,
from /usr/include/glib-2.0/glib-object.h:23,
from /home/maarten/programming/c/gobject/my-vector.h:6,
from /home/maarten/programming/c/gobject/my-vector.c:2:
/home/maarten/programming/c/gobject/my-vector.c: In function ‘my_vector_add’:
/home/maarten/programming/c/gobject/my-vector.c:214:35: warning: passing argument 1 of ‘MY_IS_VECTOR’ discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
g_return_if_fail(MY_IS_VECTOR(self));
这会导致警告,因为 MY_IS_VECTOR() 宏会导致代码不遵守 const 限定的 GObjects,或者在本例中是 GObject 派生实例,例如 MyVector。
gobject 系统是否忽略了 const 的正确性,或者他们是否有其他方法来实现这一点?
此外,如果我查看其他基于 gobject 的库,例如 gtk(+),我会看到像 const gchar* gtk_label_get_text (GtkLabel *label);
函数 returns a const gchar*
这样的签名,所以标签不会改变,它也可以使用 const GtkLabel*
.
Does the gobject system ignore const correctness
正确,const
-在处理 GObject 和其他引用计数的事物时忽略了正确性。这是很久以前在 GObject 的开发中做出的设计决定,我不知道具体的原因。这可能是因为尝试 const
-correct 最终会需要大量强制转换,以便“const”对象在被查询时可以暂时增加其引用计数,然后再次减少,例如。
目前我正在 trying/invesigating 创建一个基于 glib/gobject 库的库。所以我试图制作一个 GObject 风格的数学向量。向量可以加在一起,所以我试图用伪代码实现的是:v1 = [1, 2, 3, 4]
、v2 = [1, 2, 3, 4]
和 v_add_result = v1 + v2
。如您所见,应该为结果分配一个新向量,并且对于此操作 v1 和 v2 不会更改,因此,我希望这些 const 合格。
来自我的-vector.h:
#define MY_TYPE_VECTOR (my_vector_get_type())
G_DECLARE_DERIVABLE_TYPE(MyVector, my_vector, MY, VECTOR, GObject)
struct _MyVectorClass
{
GObjectClass parent_class;
MyVector* (*add) (const MyVector* self, const MyVector* other);
void (*add_is)(MyVector* self, const MyVector* other);
MyVector* (*sub) (const MyVector* self, const MyVector* other);
void (*sub_is)(MyVector* self, const MyVector* other);
};
MyVector* my_vector_new();
MyVector* my_vector_new_vals(double v1, double v2, double v3, double v4);
// This is the function which in theory could be implemented with const MyVectors
MyVector* my_vector_add(const MyVector* self, const MyVector* rhs);
然后为了实现加法,我有一个 public 加法函数,它检查其输入是否是有效的 MyVector 实例。但是,如果我尝试检查实例是否是有效的 MyVector 实例,我会收到一条关于宏的警告,该宏应该根据 gobject 系统检查指针是否实际指向有效的 MyVector 实例。
以及来自 my-vector.c:
的片段MyVector*
my_vector_add(const MyVector* self, const MyVector* other)
{
g_return_if_fail(MY_IS_VECTOR(self));
g_return_if_fail(MY_IS_VECTOR(other));
const MyVectorClass* klass = MY_VECTOR_GET_CLASS(self);
g_return_if_fail(klass->add != NULL);
return klass->add(self, other);
}
我收到的编译器警告是:
In file included from /usr/lib/x86_64-linux-gnu/glib-2.0/include/glibconfig.h:9:0,
from /usr/include/glib-2.0/glib/gtypes.h:32,
from /usr/include/glib-2.0/glib/galloca.h:32,
from /usr/include/glib-2.0/glib.h:30,
from /usr/include/glib-2.0/gobject/gbinding.h:28,
from /usr/include/glib-2.0/glib-object.h:23,
from /home/maarten/programming/c/gobject/my-vector.h:6,
from /home/maarten/programming/c/gobject/my-vector.c:2:
/home/maarten/programming/c/gobject/my-vector.c: In function ‘my_vector_add’:
/home/maarten/programming/c/gobject/my-vector.c:214:35: warning: passing argument 1 of ‘MY_IS_VECTOR’ discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
g_return_if_fail(MY_IS_VECTOR(self));
这会导致警告,因为 MY_IS_VECTOR() 宏会导致代码不遵守 const 限定的 GObjects,或者在本例中是 GObject 派生实例,例如 MyVector。
gobject 系统是否忽略了 const 的正确性,或者他们是否有其他方法来实现这一点?
此外,如果我查看其他基于 gobject 的库,例如 gtk(+),我会看到像 const gchar* gtk_label_get_text (GtkLabel *label);
函数 returns a const gchar*
这样的签名,所以标签不会改变,它也可以使用 const GtkLabel*
.
Does the gobject system ignore const correctness
正确,const
-在处理 GObject 和其他引用计数的事物时忽略了正确性。这是很久以前在 GObject 的开发中做出的设计决定,我不知道具体的原因。这可能是因为尝试 const
-correct 最终会需要大量强制转换,以便“const”对象在被查询时可以暂时增加其引用计数,然后再次减少,例如。