我已经在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
答案 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可以配置为允许这样做,但是我不会查看是如何完成的,因为对该数据的任何进一步写访问都会导致未定义的行为。您应该修改代码。你需要使用它的场景是什么?