Напоминание про inline и static. Синглтон. — различия между версиями
Katepol (обсуждение | вклад) м (переименовал «Напоминание про inline и static» в «Напоминание про inline и static. Синглтон.») |
Katepol (обсуждение | вклад) (→Inline) |
||
Строка 5: | Строка 5: | ||
</source> | </source> | ||
'''Где ее разместить: в cpp или в header'e?''' | '''Где ее разместить: в cpp или в header'e?''' | ||
− | 1) При размещении любой функции в заголовочном файле, если данный header включен в несколько файлов вашего проекта, проект упадет при линковке, если ваша функция не inline. | + | 1) При размещении любой функции в заголовочном файле, если данный header включен в несколько файлов вашего проекта, проект упадет при линковке, если ваша функция не inline. |
− | 2) Ключевое слово inline обязывает программиста размещать такую функцию в header'e, так как | + | 2) Ключевое слово inline обязывает программиста размещать такую функцию в header'e, так как |
− | + | * определение функции должно быть видно из того места в коде, где она используется; | |
− | + | * если разделить определение и тело inline функции, то ее можно будет использовать только в том cpp файле, в котором находится ее тело. | |
Если определить метод внутри класса, то он автоматически становится inline: | Если определить метод внутри класса, то он автоматически становится inline: | ||
Строка 27: | Строка 27: | ||
... | ... | ||
} | } | ||
− | </source> | + | </source> |
==Глобальные переменные== | ==Глобальные переменные== |
Версия 12:34, 23 апреля 2011
Содержание
Inline
Рассмотрим некоторую inline функцию:
inline void f() {}
Где ее разместить: в cpp или в header'e?
1) При размещении любой функции в заголовочном файле, если данный header включен в несколько файлов вашего проекта, проект упадет при линковке, если ваша функция не inline. 2) Ключевое слово inline обязывает программиста размещать такую функцию в header'e, так как
- определение функции должно быть видно из того места в коде, где она используется;
- если разделить определение и тело inline функции, то ее можно будет использовать только в том cpp файле, в котором находится ее тело.
Если определить метод внутри класса, то он автоматически становится inline:
class T {
int size_;
public:
size_t getSize() const { // inline!
return size_;
}
};
Шаблонные функции - тоже inline, по очевидной причине: шаблонная функция должна быть определена к моменту вызова (при инстанциировании).
template <typename T>
void swap (T & a, T & b) {
...
}
Глобальные переменные
Что мы о них знаем? Что их не нужно использовать :), так как невозможно спрогнозировать, что лежит в этой переменной. Если у нас все же есть глобальная переменная и она определена в нескольких cpp файлах, то наша программа упадет при линковке. Избежать этого позволяет ключевое слово extern:
// 1.cpp
int i = 0;
// 2.cpp
extern int i; // extern указывает на то, что i определена где-то снаружи
На самом деле, перед любым объявлением функции автоматически ставится extern (можно явно писать, ошибки не будет).
Статические переменные
Если уж очень нужны глобальные переменные, лучше использовать статические переменные. Ключевое слово static обеспечивает защиту от перекрытия имен. Static может использоваться в 5 контекстах: