пятница, января 28, 2005

Инлайн-функции и макросы

Чем отличаются инлайн-функции от макросов?

#define Max(x,y) ((x)>(y)?(x):(y))

inline int Max(int x, int y)
{
return x>y?x:y;
}

Макросы обрабатываются препроцессором, а инлайн-функции компилятором.

Макрос не будет делать проверку типа и вычислять аргументы. Для Max(++x, y) результат будет разным.

Макросы не обращают внимания на пространство имен. Если объявить функцию Max, скажем, внутри класса, то она не перекроет макрос.

Макросы сложнее отлаживать, компилятор не видит макросы и не сможет точно сказать где произошла ошибка. Это особенно неудобно, если макрос большой.

понедельник, января 24, 2005

Друзья

По стандарту С++ (11.4.9) можно объявить другом класс, который нигде ранее объявлен не был. То есть, если опечатаешься в названии класса, то ошибка не вылезет, потому что вот такое компилятор пропустит:
class CMyClassAA {
...
};

class CMyClassAB {
...
friend class CMyClassA;
...
};

Более того, вот такой номер тоже пройдет:

class CMyClassAB {
...
friend class CMyClassA;
CMyClassA* a;
...
};
То есть friend class CMyClassA; здесь фактически является декларацией.

А вот назвать другом необъявленную функцию по стандарту нельзя. Но и Visual C++ 6.0, и C++ Builder 4 такое пропустили:

class CMyClassAB {
...
friend class CMyClassA;
friend void UndeclaredFunction();
CMyClassA* a;
...
};