У меня есть функция, которая должна быть включена в две разные единицы перевода (то есть файлы cpp) из общего заголовка.
Я мог бы использовать анонимное пространство имен, чтобы эта функция включалась в оба TU без конфликтов, но мне интересно, какой был бы лучший способ выполнить это (статический? Я не думаю, что глобальный мог бы работать, несколько определений)
Если вы хотите, чтобы это была одна и та же функция в каждом TU, используйте inline
. Это то, что inline
в: общие функции, определенные в заголовках.
В предположительно маловероятном случае, когда вы хотите, чтобы он был другой функцией в каждом TU, используйте либо неназванное пространство имен, либо static
. Я не думаю, что стандарт дает официальное представление, которое предпочтительнее в C++, но вы, похоже, считаете его неназванным пространством имен.
Какой из них вы хотите, зависит от того, почему вы в первую очередь ставите определение функции в файл заголовка и как вы собираетесь использовать заголовок.
Если вы хотите, чтобы компилятор рассматривал эту функцию как другую функцию в каждом CU, вы можете включить ее определение в неназванное пространство имен. Согласно C++ 2011 Стандартные объекты, объявленные в неназванных пространствах имен, имеют внутреннюю связь.
Вам нужно узнать разницу между объявлением функции и ее определением. За исключением шаблонов и встроенных функций только объявление функции должно быть в файле заголовка, определение функции должно быть в единицах перевода.
void foobar( int ); // this is function declaration, now you can call this function
// you can put it on your sources as many times as you want
void foobar( int param ) { // this is function definition, it should appear only once
...
}
static
не являющиеся членами. И функционирует в безымянных пространствах имен. На самом деле довольно много вещей :-)
static
функцию без имен или безымянного пространства имен - это, по меньшей мере, странно. Какова будет цель?
inline
является правильным подходом.