Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
gobject中的const正确性_C_Gobject - Fatal编程技术网

gobject中的const正确性

gobject中的const正确性,c,gobject,C,Gobject,目前,我正在尝试/研究基于glib/gobject库制作一个库。所以我试着用GObject风格做一个数学向量。向量可以加在一起,所以我尝试在伪代码中实现:v1=[1,2,3,4],v2=[1,2,3,4]和v\u add\u result=v1+v2。正如您所看到的,应该为结果分配一个新的向量,对于这个操作,v1和v2不会改变,因此,我希望这些const是合格的 从我的向量h: #define MY_TYPE_VECTOR (my_vector_get_type()) G_DECLARE_DER

目前,我正在尝试/研究基于glib/gobject库制作一个库。所以我试着用GObject风格做一个数学向量。向量可以加在一起,所以我尝试在伪代码中实现:
v1=[1,2,3,4]
v2=[1,2,3,4]
v\u add\u result=v1+v2
。正如您所看到的,应该为结果分配一个新的向量,对于这个操作,v1和v2不会改变,因此,我希望这些const是合格的

从我的向量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);
然后,为了实现加法,我有一个公共加法函数,它检查其输入是否为有效的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()宏导致的代码不符合常量限定的GObject,或者在本例中不符合GObject派生实例(如MyVector)

gobject系统是否忽略常量正确性,或者他们是否有其他方法来实现这一点

另外,如果我查看基于gobject的其他库,例如gtk(+),我会看到像
const gchar*gtk_label\u get_text(GtkLabel*label)这样的签名
函数返回一个
常量gchar*
,因此标签不会更改,它也可能使用
常量GtkLabel*

gobject系统是否忽略常量正确性


正确,
const
-在处理gobject和其他引用计数的内容时,正确性被忽略。这是很久以前在GObject的开发中做出的一个设计决策,我不知道它的确切原因。这可能是因为试图成为
const
-正确的对象最终需要进行大量的强制转换,以便“const”对象可以在被查询时暂时增加其引用计数,然后再次减少,例如。

GObject样式的代码(如GTK)通常对字符串表示constness,但对于对象,它很少这样做。实际上,它可能是可以的,但实际上它不是这样结束的,所以它周围的机器不能很好地支持它。您可以自己定义宏,而不是使用GLib宏来为您定义宏。但由于其他明显的原因,这并不好。@underline\d我还有很多东西要学。我将签名更改为
MyVector*MyVector\u add(MyVector*v1,MyVector*v2)
,下一个警告出现了,因为g\u返回\u如果\u失败,会执行类似
返回的操作
和my函数返回指针。因此,它可能应该通过MyVector**作为函数参数返回。不,如果失败(NULL)则可以
g\u return\u val\u。