inline
или нет, если заголовок скопирован как минимум в два файла, вы больше не можете связывать файлы.
Единственный способ безопасно реализовать функцию в заголовке - использовать static
. Таким образом, каждая копия функции будет невидима для других.
Обратите внимание, что нет ограничений на их совместное использование, поэтому вы можете смело писать:
static inline bool testab(int a, int b)
{
return a>b;
}
Редактировать: Подробнее
inline
сообщает компилятору, что вы думаете, что функция достаточно мала, чтобы ее можно было встроить. То есть вы говорите компилятору, что не думаете, что дополнительное пространство для встраивания функции имеет большое значение, в отличие от (небольшого) (возможного) прироста производительности для нее. Большинство компиляторов, однако, достаточно умны, чтобы решить, что самостоятельно и с вашим ключевым словом они просто будут стремиться к немного больше в строке и не обязательно всегда будут вас слушать. Это зависит от компилятора, конечно. Некоторые компиляторы могут полностью игнорировать ключевое слово.
static
, с другой стороны, означает, что независимо от области, в которой определена статическая переменная, она будет невидима вне ее. Если в функции есть переменная static
, она будет невидима вне ее. Если в файле есть переменная static
(то есть статическая глобальная переменная), она будет невидима вне его, что означает, что после компиляции символа там нет, чтобы компоновщик увидел и запутался. Вот почему, если вы написали библиотеку, в которой есть глобальные переменные или функции, которые не должны быть видны за пределами библиотеки, вы должны объявить их как static
.
Редактировать 2: Исправление
Очевидно, согласно этому ответу , функции inline
не должны экспортировать свои идентификаторы для компоновщика. Тем не менее, к нему можно прикрепить static
в любом случае, чтобы сделать его более понятным. Также очевидно, что некоторые компиляторы в любом случае экспортируют идентификатор, поэтому в этих случаях static
действительно необходим.