- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这段代码:
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/
这段代码: void Pack::packUInteger(void **buffer, unsigned int payload){ memcpy(*buffer, &payload, si
GCC 文件说 -Wpointer-arith 警告任何依赖于函数类型的“大小”或“void”的内容。 GNU C 将这些类型的大小指定为 1,以方便使用“void *”指针和函数指针进行计算。在 C
到目前为止,我在 Isabelle 遇到的每个目标都可以使用 arith 解决。也可以通过 presburger 解决反之亦然,例如 lemma "odd (n::nat) ⟹ Suc (2 * (n
我需要使用标准库中称为 Coq.Arith.PeanoNat ( https://coq.inria.fr/library/Coq.Arith.PeanoNat.html ) 的部分。 我尝试过导入整
请看下面的代码: #include #include using namespace std; class ex { public: int x; int y; doub
我正在制作一个 C++ 程序,但我有一个不断出现的警告(我正在使用 g++): warning: pointer to a function used in arithmetic [Wpointer-
我知道这个问题已经得到了部分回答 here on S.O. ,但他们在那里解释了算术溢出期间发生的什么。在 S.O. 的其他地方他们解释 how to check for overflow在 java
我是一名优秀的程序员,十分优秀!