gpt4 book ai didi

c++ - 如何摆脱 -Wpointer-arith

转载 作者:行者123 更新时间:2023-11-27 23:40:42 25 4
gpt4 key购买 nike

这段代码:

void Pack::packUInteger(void **buffer, unsigned int payload){
memcpy(*buffer, &payload, sizeof(unsigned int));
*buffer += sizeof(unsigned int);
}

产生这个警告,我想在不告诉编译器忽略它的情况下摆脱它:

src/messaging/Pack.cpp: In static member function ‘static void Pack::packUInteger(void**, unsigned int)’:
src/messaging/Pack.cpp:33:10: warning: pointer of type ‘void *’ used in arithmetic [-Wpointer-arith]
*buffer += sizeof(unsigned int);
~~~~~~~~^~~~~~~~~~

我知道应该需要取消引用和强制转换,但我不知道如何正确执行。

感谢互联网! :)

最佳答案

除非您显示指针指向的位置,否则无法验证这是正确的。

但如果您尝试将指针递增 sizeof(unsigned int),那么如果 *buffer 指向 数组的一个元素就有意义了>unsigned int,并且您尝试将指针递增到下一个兄弟。

正确的做法是:

auto ptr = static_cast<unsigned*>(*buffer);
*buffer = ptr + 1;

另一方面,如果 if 指向原始存储,例如 std::byte,正确的方法是:

auto ptr = static_cast<std::byte*>(*buffer);
*buffer = ptr + sizeof payload;

我建议不要使用 void**,而是使用以下内容:

template <class T>
std::byte* pack(std::byte* buffer, T payload) {
static_assert(std::is_trivially_copyable_v<T>);
std::memcpy(buffer, std::addressof(payload), sizeof payload);
return buffer + sizeof payload;
}

关于c++ - 如何摆脱 -Wpointer-arith,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55263037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com