在某些情况下,-fpermissive选项导致错误被完全忽略,而不是像广泛使用的文档所建议的那样“降级”为警告。
-Wall选项显然不够。为了使g ++报告所有此类降级的警告,还需要其他什么选项?
Nodejs C ++插件库提供了一个示例。
In file included from /opt/nodejs/linux64/8.9.4/include/node/node.h:63:0,
from /opt/nan/linux64/2.9.2/include/nan.h:51,
from /build/ndjs/include/blob.h:59,
from /build/ndjs/src/blob.cpp:2:
/opt/nodejs/linux64/8.9.4/include/node/v8.h: In instantiation of ‘v8::Local<T>::Local(v8::Local<S>) [with S = v8::Integer; T = v8::Int32]’:
/build/src/ndjs/blob.cpp:507:1: required from here
/opt/nodejs/linux64/8.9.4/include/node/v8.h:207:5: error: invalid conversion from ‘v8::Integer*’ to ‘v8::Int32*’ [-fpermissive]
TYPE_CHECK(T, S);
^
使用-fpermissive(当然还有-Wall)重新编译会产生干净的编译结果:完全没有警告。发生了什么? (即为什么?)
TYPE_CHECK()宏测试指针分配中的类型兼容性:
#define TYPE_CHECK(T, S) \
while (false) { \
*(static_cast<T* volatile*>(0)) = static_cast<S*>(0); \
}
向下转换失败(v8 :: Int32派生自v8 :: Integer),但是当-fpermissive生效时,在某种程度上成功运行而没有警告。不应就静态下垂发布警告吗?