Следует ли использовать ключевое слово inline для переменных в анонимных пространствах имен в файле .cpp?

Если у меня есть constexpr, определенный в анонимном пространстве имен в файле .cpp. Должен ли он быть объявлен как встроенный? Или нет?

В чем будет разница между двумя декларациями?

// In my.cpp 
namespace { 
constexpr int kVal{4};
// or
inline constexpr int kOtherVal{4};
} // anonymous namespace

// Later a class or function in my.cpp uses the constant

Я не думаю, что для этого есть основания. Все имена в безымянном пространстве имен имеют внутреннюю связь. Для меня inline не является знаком встраивания этого кода, хотя его можно использовать как подсказку: компилятор может игнорировать его для целей встраивания.

NathanOliver 16.07.2024 16:33

На самом деле это не имеет значения. Имена (включая переменные) в безымянном пространстве имен имеют внутреннюю связь. inline позволяет каждому исходному файлу отдельно определять переменную без проблем, связанных с несколькими определениями. Итак, вы достигаете одного и того же, с ключевым словом inline или без него. Кроме того, в лучшем случае inline является подсказкой для компилятора, и компилятору разрешено его игнорировать (т. е. если добавление inline может достичь чего-то большего, чем размещение переменной в анонимном пространстве имен, с вашим конкретным компилятором, ваш компилятор не обязан сделай это).

Peter 16.07.2024 16:36
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
3
119
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Отметка объекта как inline может служить двум целям:

  1. Подсказка компилятору для оптимизации (но он все равно может ее проигнорировать) - для функций.
  2. Объявление множественных определений между единицами перевода не является нарушением ODR.

Но поскольку все имена в безымянном пространстве имен (включая имена переменных) имеют внутреннюю связь, в данном случае это не имеет особого значения (только одна единица перевода имеет доступ к имени).

Поэтому здесь особой разницы нет.

Что будет (1) делать с переменными (в отличие от функций)?

HolyBlackCat 16.07.2024 17:31

@HolyBlackCat, ты прав. Изменил формулировку.

wohlstad 16.07.2024 17:35

Другие вопросы по теме