3

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

4

3 回答 3

5

这并不是说 gcc 是迂腐的。const char*是指向 的指针,它与指向const char的 非常不同。对于后者你可以修改指针的内容,对于前者你不能。允许这种转换是隐式的会引起严重的错误,因为使用非 const 指针修改内容是微不足道的,即使内容应该是不可修改的。char*chara

从理论上讲,您可以抛弃 constness:

char* b = const_cast<char*>(a);

这告诉编译器你知道你正在做的事情是不安全的,但是如果发生了可怕的事情(你试图修改 a 的数据const char*)你将承担全部责任,因为你明确告诉它在那个位置忽略 const 是好的. 类似的事情应该很少做,并且只有在验证它是好的之后。

查找 gcc 和 mingw 在编译时实际上接受了隐式-fpermissive转换(这会将其降级为警告)。但是使用这种不安全的功能是一个非常糟糕的主意,所以我的建议是尽可能远离这些邪恶的诱惑。而不是降低错误阈值,我宁愿建议像-Wall,-Wextra甚至可能使编译-pedantic-Werror尽可能挑剔的选项。这样做在编程时可能会很痛苦,但可以轻松地为您节省数小时的调试时间(-Werror当然,没有警告策略)。

char*与您的问题没有直接关系,但由于您使用的是 c++:当您可以使用时,为什么需要std::string

于 2012-10-08T16:24:38.550 回答
0

没有选项可以忽略此转换,因为 a 是 cont char*,这意味着 a 指向的值不应更改,因此从 const char* 到 char* 的强制转换被认为是不安全的,因为 b 可以更改 a 指向的值。

于 2012-10-08T16:27:21.517 回答
0

这不应该任何编译器中工作。但是,一些旧版本的编译器、C 标准和其他差异可能会导致该错误不会被发出(或只是一个警告)。我相信 GCC 可以配置为允许这样做,但我不会查看它是如何完成的,因为对该数据的任何进一步写入访问都会导致未定义的行为。相反,您应该修复您的代码。您需要在什么场景中使用它?

于 2016-02-10T12:59:16.710 回答