忽略无效的转换错误,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 的指针,它与指向charchar* 非常不同。对于后者你可以修改指针的内容,对于前者你不能。允许这种隐式转换会引起严重的错误,因为使用非 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“错误:标量初始化器类型的大括号”错误。让他们警告

gcc 中是不是有一个编译标志来克服“错误:无效的存储类”?

oracle 忽略子查询中的无效标识符错误

C - “从“int*”到“int”的无效转换

如何忽略 Guzzle 5 中的无效 SSL 证书错误

pg_restore 重复键和无效命令错误