2013-09-19 2 views
0

Можно ли объяснить мне синтаксис следующего выражения, найденного в utsname.h (определение utsname):ехЬегп декларация с броском()

extern int uname (struct utsname *__name) __THROW; 

__THROW является макро и дает throw() от cdefs.h. Почему он может быть помещен таким образом в определение внешней функции?

ответ

2

Объявление функции как броска означает, что при использовании этой функции не будут выбрасываться исключения.

Скопировано из http://www.cplusplus.com/doc/tutorial/exceptions/

спецификации исключений

При объявлении функции можно ограничить исключение типа это может прямо или косвенно бросить, добавляя суффикс вбрасывание в объявлении функции:

float myfunction (char param) throw (int); 

Это объявляет функцию myfunction, которая принимает один аргумент типа char и возвращает элемент типа float. Единственное исключение, которое может вызвать эта функция, является исключением типа int. Если он генерирует исключение с другим типом, прямо или косвенно, его нельзя поймать обычным обработчиком типа int.

Если этот спецификатор throw оставлен пустым без какого-либо типа, это означает, что функции не допускают исключения. Функции без спецификатора throw (регулярные функции) допускаются для исключения исключений из любого типа:

int myfunction (int param) throw(); // no exceptions allowed 
int myfunction (int param);   // all exceptions allowed 
+1

Следует отметить, что в настоящее время устаревшие спецификации исключений являются устаревшими. В C++ 11 (или позже) вы должны предпочесть 'noexcept' для' throw() ', а не использовать' throw (something) 'вообще. –

+0

Предполагаю, что он использует макрос __NOTHROW, так что его можно переопределить до компилятора C++ 11 до конца. – Neil

+0

Я думаю, что это больше, чтобы заголовки могли быть включены в программы на C или C++. У моей версии, по крайней мере, нет версии C++ 11, хотя, возможно, это будет и в будущем. –

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