2015-11-05 2 views
5

Я хочу использовать простое время компиляции константы, например, так:Как определить constexpr переменной

double foo(double x) { return x + kConstDouble; } 

Теперь я вижу, по крайней мере, одним из следующих способов, чтобы определить, что постоянное

namespace { static constexpr double kConstDouble = 5.0; } 
namespace { constexpr double kConstDouble = 5.0; } 
static constexpr double kConstDouble = 5.0; 
constexpr double kConstDouble = 5.0; 

Каких это правильный путь? Есть ли разница, когда kConstDouble определен в заголовке или исходном файле?

+0

Все четыре находятся в порядке, и вы также можете «#define kConstDouble 5.0» –

ответ

0

Использование статического или анонимного пространства имен приведет к тому, что переменная будет иметь внутреннюю связь; он будет отображаться только в пределах одной единицы перевода. Поэтому, если вы используете один из них в файле .cpp, вы не сможете использовать эту переменную где-либо еще. Это будет сделано, если константа является деталью реализации этой единицы кода. Если вы хотите выставить его на другие единицы перевода, вам нужно поместить его в файл заголовка. Типичным способом сделать это было бы объявить его статическим (или помещать его в анонимное пространство имен), так как это тривиальная и постоянная переменная. Другим подходом было бы объявить его extern в заголовке и определить его в .cpp, чтобы получить по-настоящему глобальную переменную (в отличие от верхней, где на самом деле каждый tu имеет свою собственную копию).

Между статическим и анонимным пространством имен; хорошо, что вам не нужны в первую очередь. Они оба делают то же самое, что и AFAIK. Но я думаю, что в настоящее время более идиоматично использовать анонимные пространства имен в файлах cpp, поскольку они могут использоваться для предоставления функций, классов и т. Д. Внутренней связи. С другой стороны, когда вы хотите использовать его для создания переменной, доступной глобально, чаще всего используется статический; Я никогда не использую анонимные пространства имен в заголовочных файлах, поскольку считаю это вводящим в заблуждение.

 Смежные вопросы

  • Нет связанных вопросов^_^