2013-11-15 3 views
6

Когда я использую лязг (version 3.4 (trunk 194574)) скомпилировать это:[[noreturn]] Указатель функции

typedef void (* FunctionThatNeverReturns [[ noreturn ]])(); 

я получаю это:

error: 'noreturn' attribute only applies to functions and methods 

Что меня удивляет, так как он работал прекрасно с старше версия clang.

Так как я могу определить указатель на функцию [[ noreturn ]]?

Мне нужно это, потому что я вызываю указатель функции внутри функции [[ noreturn ]], которая, очевидно, выдает предупреждение, если указатель функции не помечен как noreturn.

О, и это работает:

typedef void (* FunctionThatNeverReturns [[ gnu::noreturn ]])(); 

Но не существует никакой компилятор-независимое решение?

+3

Вы не можете? Атрибуты не входят в число типов. –

+0

@ R.MartinhoFernandes Так это когда-то работало из-за ошибки в clang? –

+0

@ R.MartinhoFernandes: Согласно моему стандарту, это не так. И сообщение об ошибке соглашается. Это '[[noreturn]]' в частности, что не относится к типам. –

ответ

0

Попробуйте

typedef void (* FunctionThatNeverReturns)() [[ noreturn ]]; 

В вашем оригинале, спецификатор размещен таким образом, что оно применяется к указателю, а не объект указал. Но указатель noreturn вообще не имеет смысла, вы пытаетесь набрать указатель на функцию noreturn.

Демонстрация: http://ideone.com/9mBR9x

+2

FWIW, clang отклоняет этот код, утверждая, что [[noreturn]] не может применяться к типам. –

+0

Также обратите внимание на это: http://ideone.com/CH8Ny7 –

+0

@R.MartinhoFernandes: Да, g ++, похоже, знает, что что-то не так, но он никогда не говорит вам, что. –

Смежные вопросы