C++ 忽略无效的转换错误,GCC
我已经在Windows上与MinGW合作了一段时间,现在我正试图在Mac上编译它(使用GCC)。我正在使用Qt,但这与问题没有多大关系 为什么GCC如此正式,让我投下一切?我必须经历和投下所有不匹配的东西,这太可笑了 例如,它将抛出以下错误:C++ 忽略无效的转换错误,GCC,c++,qt,gcc,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编译器或
main.cpp: error: invalid conversion from 'const char*' to 'char*'
使用此代码:
const char *a = "a";
char *b = a;
是否有任何标志可以传递给GCC编译器或任何预处理器指令来告诉它忽略这些标志?谢谢
编辑:让我重新措辞。为什么它在MinGW上工作,而在GCC上不工作,我能让它在GCC上工作吗
编辑2:MinGW-这并不是说gcc很迂腐
const char*
是指向const char
的指针,它与指向char
的char*
类型截然不同。对于后者,您可以修改指针的内容,对于前者,您不能。允许这种隐式转换将引发严重的错误,因为使用非常量指针修改a
的内容将是微不足道的,即使这些内容不应该是可修改的
从理论上讲,你可以抛弃这种恒定性:
char* b = const_cast<char*>(a);
char*b=const_cast(a);
这告诉编译器您知道您所做的是不安全的,但是如果发生了可怕的事情(您试图修改常量char*
的数据),您将承担全部责任,因为您明确地告诉编译器忽略该位置的常量是可以的。像这样的事情应该少做,并且只有在确认它是正确的之后
在使用-fppermissive
编译时,在gcc和mingw中查找它实际上接受隐式强制转换(这会将其降级为警告)。然而,使用这些不安全的功能是一个非常糟糕的主意,所以我的建议是尽可能远离这些邪恶的诱惑。与其降低错误阈值,我倒不如建议一些选项,比如-Wall
,-Wextra
,甚至可能-pedantic
和-Werror
,让编译器尽可能挑剔。这样做在编程时可能会很痛苦,但可以很容易地为您节省数小时的调试时间(使用无警告策略或-Werror
)
与您的问题没有直接关系,但因为您使用的是c++:当您可以使用
std::string
时,为什么需要char*
?没有选项可以忽略此转换,因为a是cont char*,意味着
不应该改变,所以从const char到char *的转换被认为是不安全的,因为B可以改变由A/P>< P>所指出的值。但是,一些较旧版本的编译器、C标准和其他差异可能会导致该错误不会发出(或者只是一个警告)。我相信GCC可以配置为允许这样做,但我不会查看它是如何实现的,因为对该数据的任何进一步写访问都会导致未定义的行为。您应该改为修复代码。您需要在什么场景中使用此功能?我当然希望不会!对我来说,禁用它听起来是个糟糕的主意。真正的问题是,为什么你会陷入这样一种情况,你甚至想这样做。如果编译器只是忽略类型和类型限定符,那么类型和类型限定符有什么意义呢?你试图做的是邪恶的。“为什么这对MinGW有效,但对GCC无效,我能让它对GCC有效吗?”——MinGW是GCC。或者更确切地说,这是它在windows上的一个发行版。你在做其他不同的事情,因为你的代码片段实际上没有在MinGW上编译。我一定在做一些非常愚蠢的事情。。。?告诉那些可怜的iconv用户。一些编译器将其声明为
iconv(…,char**src,…)
,而其他编译器则使用iconv(…,const char**src,…)
。如果不在构建系统中测试正确的声明,就无法同时支持这两个方面-_-