具有内在函数的GCC不兼容指针类型警告

时间:2015-09-12 12:05:44

标签: c gcc

a->data的类型为uint64_t *。我在头文件中查找了它,uint64_t被定义为unsigned long int。我想使用_addcarryx_u64函数。根据头文件,此函数的最后一个参数是unsigned long long *类型。

两者都是无符号的64位整数。但从技术上来说它们是不同的,我不断收到像这样的烦人的警告......

warning: passing argument 4 of ‘_addcarryx_u64’ from incompatible pointer type

char c = _addcarryx_u64(0, a->data[0], b, a->data);

如何解决此问题或禁用警告。我知道我可以投射我的指针,但我喜欢以某种程度上独立于编译的方式进行编码,addcarryx可以在另一个系统上进行不同的定义。

另外在旁注中我注意到我的gcc版本仅支持addcarryx而不支持addcarry。有什么理由吗?

也正好知道我在ubuntu上运行GCC 4.9编译。我有-std=gnu99设置。

1 个答案:

答案 0 :(得分:2)

如果您不想进行投射,我建议您编写自己的包装函数,将a->data转换为正确的类型,然后将指针传递给:

struct a_struct {
    /* ... */
    uint64_t *data;
};

char addcarry_u64(int x, struct a_struct *a, int b) {
    unsigned long long data = *a->data;
    return _addcarryx_u64(0, a->data[0], b, &data);
}