所以我正在开发一个非常大的代码库,最近升级到gcc 4.3,它现在触发了这个警告:
警告:不推荐将字符串常量转换为'char *'
显然,解决这个问题的正确方法是找到每个声明
char *s = "constant string";
或函数调用如:
void foo(char *s);
foo("constant string");
并使它们成为const char
指针。 但是,这意味着触及564个文件,最小,这不是我希望在此时执行的任务。 现在的问题是我正在运行-werror
,所以我需要一些方法来扼杀这些警告。 我怎样才能做到这一点?
#1楼
PyTypeObject PyDict_Type=
{ ...
PyTypeObject PyDict_Type=
{
PyObject_HEAD_INIT(&PyType_Type),
"dict",
dict_print,
0,
0
};
观看名称字段,在gcc中编译时没有警告,但在g ++中它会,我不知道为什么。
在gcc (Compiling C)
,-Wno-write-strings默认是活动的。
in g++ (Compiling C++)
Wwrite-strings默认是活动的
这就是为什么会有不同的行为。 对于我们来说,使用Boost_python
宏Boost_python
产生这样的警告。 因此我们在编译C ++时使用-Wno-write-strings
,因为我们总是使用-Werror
#2楼
只需对g ++使用-w选项
例:
g ++ -w -o simple.o simple.cpp -lpthread
请记住,这不会避免弃用,而是会阻止在终端上显示警告消息。
现在,如果你真的想避免弃用,请使用const关键字,如下所示:
const char* s="constant string";
#3楼
我不能使用编译器开关。 所以我转过身来:
char *setf = tigetstr("setf");
对此:
char *setf = tigetstr((char *)"setf");
#4楼
传递字符串文字的任何函数"I am a string literal"
应该使用char const *
作为类型而不是char*
。
如果你要解决问题,请正确解决问题。
说明:
您不能使用字符串文字来初始化将被修改的字符串,因为它们的类型为const char*
。 抛弃const以便稍后修改它们是未定义的行为 ,因此你必须将const char*
strings char
by char
复制到动态分配的char*
字符串中以便修改它们。
例:
#include <iostream>
void print(char* ch);
void print(const char* ch) {
std::cout<<ch;
}
int main() {
print("Hello");
return 0;
}
#5楼
BlackShift的答案非常有用,我用过它:
extern string execute(char* cmd) {
FILE* pipe = popen(cmd, "r");
if (!pipe) return "ERROR";
char buffer[256];
std::string result = " ";
while(!feof(pipe)) {
if(fgets(buffer, 128, pipe) != NULL)
result += buffer;
}
pclose(pipe);
return result;
}
int main(){
char cmd[]="grep -A1 'xml' out1.txt | grep read|awk -F'=' 'BEGIN{sum=0}{sum=sum+$NF}END{print sum}'";
string result=execute(cmd);
int numOfBytes= atoi(result.c_str());
cout<<"Number of bytes = "<<numOfBytes<<endl;
return 0;
}
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3163801