所以我正在开发一个非常大的代码库,最近升级到gcc 4.3,它现在触发了这个警告:
警告:不推荐将字符串常量转换为'char*'
显然,解决这个问题的正确方法是找到每个声明
char *s = "constant string";
Run Code Online (Sandbox Code Playgroud)
或函数调用如:
void foo(char *s);
foo("constant string");
Run Code Online (Sandbox Code Playgroud)
并使他们成为const char指针.但是,这意味着触及564个文件,最小,这不是我希望在此时执行的任务.现在的问题是我正在运行-werror,所以我需要一些方法来扼杀这些警告.我怎样才能做到这一点?
Joh*_*ohn 558
传递字符串文字的任何函数"I am a string literal"都应该char const *用作类型而不是char*.
如果你要解决问题,请正确解决问题.
说明:
您不能使用字符串文字初始化将要修改的字符串,因为它们是类型const char*.虚掷常量性以后修改它们是不确定的行为,所以你要复制你的const char*字符串char通过char到动态分配的char*字符串,以对其进行修改.
例:
#include <iostream>
void print(char* ch);
void print(const char* ch) {
std::cout<<ch;
}
int main() {
print("Hello");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
DGe*_*try 222
我相信传递-Wno-write-strings给gcc会压制这个警告.
Rob*_*ker 69
查看gcc的Diagnostic Pragma支持,以及-W警告选项列表(已更改:警告选项的新链接).
对于gcc,您可以使用此处#pragma warning说明的指令.
Bla*_*ift 69
我遇到了类似的问题,我解决了这个问题:
#include <string.h>
extern void foo(char* m);
int main() {
// warning: deprecated conversion from string constant to ‘char*’
//foo("Hello");
// no more warning
char msg[] = "Hello";
foo(msg);
}
Run Code Online (Sandbox Code Playgroud)
这是解决这个问题的合适方法吗?我没有权限foo让它接受const char*,虽然这将是一个更好的解决方案(因为foo不会改变m).
Kon*_*lph 30
如果它是活动代码库,您可能仍希望升级代码库.当然,手动执行更改是不可行的,但我相信这个问题可以通过一个sed命令一劳永逸地解决.但是,我没有尝试过,所以请注意以下几点.
find . -exec sed -E -i .backup -n \
-e 's/char\s*\*\s*(\w+)\s*= "/char const* \1 = "/g' {} \;
Run Code Online (Sandbox Code Playgroud)
这可能找不到所有位置(甚至不考虑函数调用),但它可以缓解问题并使手动执行少量剩余更改成为可能.
vy3*_*y32 25
我不能使用编译器开关.所以我转过身来:
char *setf = tigetstr("setf");
Run Code Online (Sandbox Code Playgroud)
对此:
char *setf = tigetstr((char *)"setf");
Run Code Online (Sandbox Code Playgroud)
EdH*_*EdH 25
以下是如何在文件中内联,因此您不必修改Makefile.
// gets rid of annoying "deprecated conversion from string constant blah blah" warning
#pragma GCC diagnostic ignored "-Wwrite-strings"
Run Code Online (Sandbox Code Playgroud)
你可以稍后......
#pragma GCC diagnostic pop
Run Code Online (Sandbox Code Playgroud)
小智 25
更换
char *str = "hello";
Run Code Online (Sandbox Code Playgroud)
同
char *str = (char*)"hello";
Run Code Online (Sandbox Code Playgroud)
或者如果你在函数中调用:
foo("hello");
Run Code Online (Sandbox Code Playgroud)
用它代替
foo((char*) "hello");
Run Code Online (Sandbox Code Playgroud)
小智 15
代替:
void foo(char *s);
foo("constant string");
Run Code Online (Sandbox Code Playgroud)
这有效:
void foo(const char s[]);
foo("constant string");
Run Code Online (Sandbox Code Playgroud)
app*_*apu 15
在C++中,使用const_cast如下所示
char* str = const_cast<char*>("Test string");
Run Code Online (Sandbox Code Playgroud)
小智 7
Test string是const字符串.所以你可以这样解决:
char str[] = "Test string";
Run Code Online (Sandbox Code Playgroud)
要么:
const char* str = "Test string";
printf(str);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
411824 次 |
| 最近记录: |