11

我正在尝试用 g++ 编译一些 c 代码(是的,故意的)。我收到如下错误(例如):

error: invalid conversion from 'void*' to 'unsigned char*' [-fpermissive]

添加-fpermissive到编译选项让我:

error: invalid conversion from 'void*' to 'unsigned char*' [-Werror=permissive]

由于 ,这似乎是一个错误-Werror,但是添加-Wno-error=permissive -Wno-permissive会导致:

error: -Werror=permissive: no option -Wpermissive
error: unrecognized command line option "-Wno-permissive" [-Werror]

如何禁用从 void* 转换为其他指针类型的警告(全局)?

4

2 回答 2

9

您不能“禁用从转换void*到其他指针类型的警告”,因为这不是警告 - 这是语法错误。

这里发生的情况是您正在使用-fpermissive将一些错误(包括这个错误)降级为警告,因此允许您编译一些不符合标准的代码(显然许多类型的语法错误,例如缺少大括号,不能降级为警告,因为编译器不知道如何修复它们以将它们变成可理解的代码)。

然后,您还使用-Werrorwhich 将所有警告升级为错误,包括-fpermissive将您的错误变成的“警告”。

-Wno-error仅用于否定-Werror,即它导致-Werror将所有警告视为错误,除了用 指定的警告-Wno-error,这些警告仍然作为警告。正如-W标志所暗示的那样,这两个标志都适用于warnings,因此它们对这个特定问题无能为力,因为您在这里遇到的是错误。这种无效转换没有“警告”,您可以关闭和打开它,-Werror因为它不是真正的警告 - 它是一个错误,-fpermissive只是导致被视为警告。

在这种情况下,您可以通过 using和not using来编译不一致的代码。这仍然会给你一个警告,但像所有警告一​​样,它不会阻止成功编译。如果你故意试图编译不符合的代码,那么使用是没有意义的,因为你知道你的代码包含错误,因此会导致警告,即使使用,所以指定相当于说“请不要编译我的不符合密码,即使我刚刚要求你这样做。”-fpermissive-Werror-Werror-fpermissive-Werror

让 g++ 抑制警告的最远距离是使用-fsyntax-only它将检查语法错误而没有其他任何东西,但是由于您在这里遇到的是语法错误,因此对您没有帮助,而您能做的最好的事情就是拥有这变成了一个警告-fpermissive

于 2013-10-07T03:36:16.763 回答
1

如何禁用从 void* 转换为其他指针类型的警告(全局)?

那么它可能需要与编译器的代码直接交互。这可能不是你想要的。你想修复你的代码。首先,这些不是警告而是错误。您需要进行void*转换,因为如果不void*先转换 a 就无法将其转换为任何东西(在 C 中是可能的,但是它的类型安全性不如C++)。

例如你需要做

void* buffer = operator new(100);
unsigned char* etherhead = static_cast<unsigned char*>(buffer);
                                  ^
                                 cast

如果你想要一个 100 的动态分配缓冲区,unsigned char那么你最好这样做

unsigned char* p = new unsigned char[100];

并避免演员。

空指针

于 2013-10-06T22:24:36.307 回答