如何抑制'void *'到'foo *'转换的警告(通过-fpermissive从错误中减少)

时间:2013-10-06 22:20:42

标签: g++ suppress-warnings

我正在尝试用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 *到其他指针类型的转换警告(全局)?

2 个答案:

答案 0 :(得分:7)

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

这里发生的是你使用-fpermissive将一些错误(包括这一个)降级为警告,因此允许你编译一些不符合代码(显然很多类型)语法错误(例如缺少大括号)无法降级为警告,因为编译器无法知道如何修复它们以将其转换为可理解的代码。

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

-Wno-error仅用于否定-Werror,即导致-Werror将所有警告视为错误,但使用-Wno-error指定的警告,仍然是警告。正如-W标志所示,这两个标志都与警告一起使用,因此他们无法对此特定问题采取任何措施,因为您在此处拥有错误。这种无效转换没有“警告”,您可以使用-Werror关闭和打开,因为它不是真正的警告 - -fpermissive只是导致被视为警告的错误

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

你能得到g ++来抑制警告的最远方法是使用-Werror来检查语法错误而不是别的,但是因为你在这里有一个语法错误,这对你没有帮助,你所能做的最好的事情就是-fsyntax-only发出警告。

答案 1 :(得分:1)

  

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

好吧,它可能需要与编译器代码直接交互。这可能不是你想要的。你想修复你的代码。首先,这些不是警告,而是错误。您需要转换void*,因为您无法先将void*转换为任何内容而不先将其转换(但在C中可能是 less 类型安全,因为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];

并避免演员。

void pointers