忽略无效的转换错误,GCC

时间:2012-10-08 16:18:35

标签: c++ qt gcc

我已经在Windows上与MinGW合作了一段时间了,现在我正在尝试在Mac上编译它(使用GCC)。我正在使用Qt,但这与问题没什么关系。

为什么GCC如此正式,让我投下一切?这是多么荒谬的我必须经历并抛出一切不匹配的东西。

例如,它会抛出错误:

main.cpp: error: invalid conversion from 'const char*' to 'char*'

使用此代码:

const char *a = "a";
char *b = a;

是否有任何标志我可以传递给GCC编译器或任何预处理器指令告诉它忽略这些?感谢。

编辑:让我改写一下。为什么这对MinGW而不是GCC有用,我可以让它在GCC上工作吗?

编辑2: MinGW - http://i.imgur.com/zGvf6.png

3 个答案:

答案 0 :(得分:5)

并不是说gcc是迂腐的。 const char*是指向const char的指针,char*是与char非常不同的类型,指向a。对于以后你可以修改指针的内容,对于前者你不能。允许这种转换是隐式的会引起严重错误,因为使用非常量指针修改char* b = const_cast<char*>(a); 的内容是微不足道的,即使内容不应该是可修改的。

理论上你可以抛弃常数:

const char*

这告诉编译器你知道你正在做的事情是不安全的,但如果发生了可怕的事情(你试图修改-fpermissive的数据),你会全部责备,因为你明确地 告诉它,在那个位置忽略常量是好的。这样的事情应该稀疏地进行,并且只有在确认它没问题之后才能完成。

查找gcc和mingw实际上在使用-Wall进行编译时接受隐式转换(将其降级为警告)。然而,使用这种不安全的功能是一个非常糟糕的主意,所以我的建议是尽可能远离这种邪恶的诱惑。我宁愿建议-Wextra-pedantic以及甚至-Werror-Werror等选项,而不是降低错误阈值,以使编译器尽可能挑剔。在编程时这样做可能会很麻烦,但是可以轻松地节省数小时的调试时间(当然没有警告策略或char*)。

与您的问题没有直接关系,但由于您使用的是c ++:为什么在使用std::string时需要{{1}}?

答案 1 :(得分:0)

没有选项可以忽略此转换,因为a是cont char *意味着a指向的值 不应该改变,所以从const char *到char *的转换被认为是不安全的,因为b可以改变a指向的值。

答案 2 :(得分:0)

这应该在任何编译器中工作。但是,某些旧版本的编译器,C标准和其他差异可能会导致不发出错误(或只是警告)。我相信GCC可以配置为允许这样做,但是我不会查看是如何完成的,因为对该数据的任何进一步写访问都会导致未定义的行为。您应该修改代码。你需要使用它的场景是什么?