我正在尝试用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 *到其他指针类型的转换警告(全局)?
答案 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];
并避免演员。