1

以下代码片段什么都不做,但说明了问题。它是从一些使用 Numpy C API 的 Boost Python 代码中提取的。这是使用从 Debian 不稳定到挤压的 gcc 4.7 快照的后向端口测试的。

#include <boost/python/object.hpp>
#include <numpy/arrayobject.h>

int main(void)
{
  PyObject* obj=0;
  npy_int64 val;
  PyArray_ScalarAsCtype(obj, &val);
  return 0;
}

我是这样编译的。

g++-4.7 -o warn.o -c -isystem /usr/include/python2.6 -fdiagnostics-show-option -ftemplate-depth-100 -fno-strict-aliasing -ansi -pedantic -Wextra -Wall -Werror -Wno-unused-function -Wc++0x-compat -g -O3 -std=c++11 -I/usr/include/python2.6 warn.cc
warn.cc: In function 'int main()':
warn.cc:8:3: error: ISO C++ forbids casting between pointer-to-function and pointer-to-object [-Werror]
cc1plus: all warnings being treated as errors

问题是代码-pedanticPyArray_ScalarAsCtype。没有-pedantic以下编译没有错误

g++-4.7 -o warn.o -c -isystem /usr/include/python2.6 -fdiagnostics-show-option -ftemplate-depth-100 -fno-strict-aliasing -ansi -Wextra -Wall -Werror -Wno-unused-function -Wc++0x-compat -g -O3 -std=c++11 -I/usr/include/python2.6 warn.cc
g++-4.7 -o warn warn.o -L/usr/lib/python2.6/config -lpython2.6 -lboost_python

注意:我添加了=0以抑制未初始化的警告。就像我说的,代码没有做任何事情。

我想抑制或删除警告并保留-pedantic标志。从我读到的内容来看,这里没有这样的错误,但这属于标准的一些有争议的部分。我真的不明白这个问题,或者它与这行代码的关系。新的 gcc 诊断允许有选择地抑制一段代码中的警告,但它们要求您知道触发警告的特定标志,我不知道。没有-Werror旗帜我得到

warn.cc:8:3: warning: ISO C++ forbids casting between pointer-to-function and pointer-to-object [enabled by default]
4

1 回答 1

1

在标准 C++ 中,您不能在 anint*和之间进行转换int(*)()。很可能,这就是您的实施中正在发生的事情。大多数平台都允许,但不是全部。

当然,任何仅在合法平台上执行的库都没有违法。

于 2012-02-17T06:25:17.263 回答