Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 忽略无效的转换错误,GCC_C++_Qt_Gcc - Fatal编程技术网

C++ 忽略无效的转换错误,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编译器或

我已经在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-

这并不是说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,…)
。如果不在构建系统中测试正确的声明,就无法同时支持这两个方面-_-