Предупреждение «разыменование указателя с типом перенаправления приведет к нарушению правил строгого сглаживания»

Я использую код, в котором приведу enum * к int *. Примерно так:

enum foo { ... }
...
foo foobar;
int *pi = reinterpret_cast<int*>(&foobar);

При компиляции кода (g ++ 4.1.2) я получаю следующее предупреждающее сообщение:

dereferencing type-punned pointer will break strict-aliasing rules

Я погуглил это сообщение и обнаружил, что это происходит только тогда, когда включена строгая оптимизация псевдонимов. У меня есть следующие вопросы:

  • Если я оставлю код с этим предупреждением, будет ли он генерировать потенциально неправильный код?
  • Есть ли способ обойти эту проблему?
  • Если нет, возможно ли это отключить строгий псевдоним из исходного файла (потому что я не хочу отключать его для всех исходных файлов и не хочу создавать отдельное правило Makefile для этого исходного файла)?

И да, я на самом деле нужен такой вид алиасинга.

53
задан Lightness Races with Monica 8 February 2013 в 02:10
поделиться