Анонимное пространство имен для включения функции в два файла cpp

0

У меня есть функция, которая должна быть включена в две разные единицы перевода (то есть файлы cpp) из общего заголовка.

Я мог бы использовать анонимное пространство имен, чтобы эта функция включалась в оба TU без конфликтов, но мне интересно, какой был бы лучший способ выполнить это (статический? Я не думаю, что глобальный мог бы работать, несколько определений)

  • 3
    Если вы хотите добавить определение функции в заголовочный файл, тогда использование inline является правильным подходом.
  • 0
    Но это длинные функции, это имеет смысл?
Показать ещё 1 комментарий
Теги:

3 ответа

1
Лучший ответ

Если вы хотите, чтобы это была одна и та же функция в каждом TU, используйте inline. Это то, что inline в: общие функции, определенные в заголовках.

В предположительно маловероятном случае, когда вы хотите, чтобы он был другой функцией в каждом TU, используйте либо неназванное пространство имен, либо static. Я не думаю, что стандарт дает официальное представление, которое предпочтительнее в C++, но вы, похоже, считаете его неназванным пространством имен.

Какой из них вы хотите, зависит от того, почему вы в первую очередь ставите определение функции в файл заголовка и как вы собираетесь использовать заголовок.

1

Если вы хотите, чтобы компилятор рассматривал эту функцию как другую функцию в каждом CU, вы можете включить ее определение в неназванное пространство имен. Согласно C++ 2011 Стандартные объекты, объявленные в неназванных пространствах имен, имеют внутреннюю связь.

1

Вам нужно узнать разницу между объявлением функции и ее определением. За исключением шаблонов и встроенных функций только объявление функции должно быть в файле заголовка, определение функции должно быть в единицах перевода.

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
   ...
}
  • 0
    «кроме ...» и static не являющиеся членами. И функционирует в безымянных пространствах имен. На самом деле довольно много вещей :-)
  • 0
    @ SteveJessop Я думаю, что поместить в заголовок static функцию без имен или безымянного пространства имен - это, по меньшей мере, странно. Какова будет цель?
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню