Ошибка gcc с кодом API Python C - «ISO C ++ запрещает приведение между указателем на функцию и указателем на объект» - PullRequest
1 голос
/ 17 февраля 2012

Следующий фрагмент кода ничего не делает, но иллюстрирует проблему.Он был извлечен из некоторого кода Boost Python, который использует Numpy C API.Это было проверено с помощью бэкпорта снимка gcc 4.7 из нестабильной Debian для сжатия.

#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

Проблема заключается в -pedantic истрока кода PyArray_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]

1 Ответ

1 голос
/ 17 февраля 2012

В стандарте C ++ вы не можете конвертировать, скажем, между int* и int(*)(). Вероятно, это то, что происходит в вашей реализации. Большинство платформ позволяют это, но не все.

Конечно, нет ничего противозаконного в том, что любая библиотека работает только на платформах, где она легальна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...