忽略无效的转换错误,GCC
Posted
技术标签:
【中文标题】忽略无效的转换错误,GCC【英文标题】:Ignore Invalid Conversion Errors, GCC 【发布时间】:2012-10-08 16:18:34 【问题描述】:我已经在 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
【问题讨论】:
我当然希望不会!能够禁用此功能对我来说听起来是个糟糕的主意。真正的问题是为什么你会陷入你甚至想要这样做的境地。 如果编译器忽略类型和类型限定符,它们的意义何在? 你试图做的是邪恶的。 “为什么这对 MinGW 有效,但对 GCC 无效,我可以让它在 GCC 上工作吗?” -- MinGW 是 GCC。或者更确切地说,它是它在 Windows 上的一种分布。您正在做其他不同的事情,因为您的 sn-p 实际上 不 在 MinGW 上编译。 那我一定是在做一些非常愚蠢的事情......? i.imgur.com/zGvf6.png 【参考方案1】:这并不是说 gcc 是迂腐的。 const char*
是指向const char
的指针,它与指向char
的char*
非常不同。对于后者你可以修改指针的内容,对于前者你不能。允许这种隐式转换会引起严重的错误,因为使用非 const 指针修改 a
的内容是微不足道的,即使内容应该是不可修改的。
理论上你可以抛弃 constness:
char* b = const_cast<char*>(a);
这告诉编译器你知道你正在做的事情是不安全的,但是如果发生了可怕的事情(你试图修改 const char*
的数据)你要承担全部责任,因为你明确 strong> 告诉它,在那个位置忽略 constness 是可以的。这样的事情应该很少做,并且只有在验证它是好的之后。
查找 gcc 和 mingw 在使用 -fpermissive
编译时实际上接受隐式转换(将其降级为警告)。然而,使用这些不安全的功能是一个非常糟糕的主意,所以我的建议是尽可能远离这些邪恶的诱惑。我宁愿建议-Wall
、-Wextra
甚至-pedantic
和-Werror
之类的选项,而不是降低错误阈值,以使编译器尽可能挑剔。这样做在编程时可能会很痛苦,但可以轻松地为您节省数小时的调试时间(当然,没有警告政策或-Werror
)。
与您的问题没有直接关系,但由于您使用的是 c++:当您可以使用 std::string
时,为什么还需要 char*
?
【讨论】:
告诉所有那些可怜的 iconv 用户。一些编译器将其声明为iconv(..., char **src, ...)
,而其他编译器则使用iconv(..., const char **src, ...)
。如果没有在构建系统中测试正确的声明,就无法同时支持这两者。 -_-【参考方案2】:
没有忽略此转换的选项,因为 a 是 cont char* 意味着 a 指向的值 不应该改变,所以从 const char* 到 char* 的转换被认为是不安全的,因为 b 可以改变 a 指向的值。
【讨论】:
【参考方案3】:这应该不适用于任何编译器。但是,一些旧版本的编译器、C 标准和其他差异可能会导致该错误不会被发出(或只是一个警告)。我相信 GCC 可以配置为允许这样做,但我不会查看它是如何完成的,因为对该数据的任何进一步写入访问都会导致未定义的行为。相反,您应该修复您的代码。您需要在什么场景中使用它?
【讨论】:
以上是关于忽略无效的转换错误,GCC的主要内容,如果未能解决你的问题,请参考以下文章
忽略 GCC“错误:标量初始化器类型的大括号”错误。让他们警告