warning: return discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
时间: 2023-11-24 20:08:05 浏览: 283
这个 warning 通常出现在你试图从一个返回 const 指针的函数中返回一个非 const 指针的时候。例如:
```c++
const int* foo() {
const int x = 42;
return &x;
}
int* bar() {
return foo(); // warning: return discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
}
```
在这个例子中,`foo()` 函数返回一个指向常量整数的指针,而 `bar()` 函数试图从 `foo()` 函数中返回一个非常量指针,这是不安全的。因为从一个指向常量的指针转换为一个指向非常量的指针可能会导致未定义行为。
解决这个 warning 的方法是要么将 `bar()` 函数的返回类型改为 `const int*`,要么将 `foo()` 函数返回类型改为 `int*`。具体取决于你的需求。
相关问题
initialization discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
这个问题通常发生在尝试修改 const 限定的指针所指向的变量的值时。编译器会提示 initialization discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers] 的警告信息,告诉你修改 const 限定的指针所指向的变量的值是不安全的。
例如,下面的代码会触发这个警告信息:
```c
const int x = 10;
const int* ptr = &x;
*ptr = 20; // 这里会触发警告信息
```
在这个例子中,变量 x 被声明为 const int 类型,指针 ptr 也被声明为 const int* 类型,表示 ptr 所指向的变量是只读的。然而,在尝试修改 *ptr 的值时,编译器会提示上述警告信息,告诉你这样的操作是不安全的。
passing argument 1 of 'prvTwisSendInitPacket' discards 'const' qualifier from pointer target type [-Wdiscarded-qualifiers]
这个警告信息来自C++,"passing argument 1 of 'prvTwisSendInitPacket'"表示在调用名为`prvTwisSendInitPacket`的函数时,第一个参数存在问题。`[-Wdiscarded-qualifiers]`是编译器发出的警告,指出你在传递一个指针时忽略了它的`const`资格修饰符。
通常,这意味着函数期望的是一个非`const`指针作为参数,但实际上你传递了一个指向常量的对象或指针。在C++中,`const`修饰符用于声明对象不会改变其值,如果函数不需要修改传入对象的状态,而你仍然将它标记为`const`,那么编译器会发出警告,因为你可能会无意间丢弃了对数据所有权的控制或者违反了预期的行为。
要修复这个问题,你需要确保要么传递一个非`const`的相应指针,要么确保函数本身可以接受`const`参数,例如通过在函数签名中添加`const`关键字:
```cpp
void prvTwisSendInitPacket(const void* ptr); // 如果函数允许接收const指针
// 或者在调用时去掉 const:
yourConstObject yourData;
prvTwisSendInitPacket(&yourData); // 不推荐,除非函数确实需要复制或修改const对象
```
阅读全文