Могу ли я определить макрос в заголовочном файле? - PullRequest
0 голосов
/ 26 февраля 2019

У меня есть определение макроса в MyClass.h, сформулированное так:

#define _BufferSize_ 64

Я поместил директиву include для MyClass.h внутри main.cpp:

#include "MyClass.h"

Означает ли это, что я могу использовать BufferSize в main.cpp и MyClass.h?Кроме того, это хорошая практика?

Ответы [ 3 ]

0 голосов
/ 26 февраля 2019

Да, это и есть цель заголовочных файлов: создание объявлений и констант в одном файле, которые вы можете «включать» в единицы перевода в любое время.

Однако имя вашего макроса недопустимо , и хороший constexpr size_t BufferSize = 64 был бы более идиоматическим в наши дни;даже до последних версий C ++ во многих случаях типизированная константа была бы предпочтительнее макроса.

0 голосов
/ 26 февраля 2019

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

Директива #include "MyClass.h" просто копирует все содержимое файла MyClass.h и вставляет его вместо #include.С точки зрения компилятора есть только один исходный файл, составленный из файла, указанного пользователем, и всех включенных файлов.


Сказав это, было бы намного лучше, если бы вы использовалиязыковая конструкция вместо директивы препроцессора.Например, замените:

#define _BufferSize_ 64

на

constexpr size_t BufferSize = 64;

Единственное, что он делает иначе, чем #define, - это то, что он указывает тип значения (size_t в этом случае).Кроме того, второй код будет вести себя так же, и он избегает недостатков препроцессора.

В общем, старайтесь избегать использования директив препроцессора.Это старый механизм, который использовался, когда c ++ еще не делал этого на языке.

0 голосов
/ 26 февраля 2019

Во-первых, в отношении идентификатора _BufferSize_ стандарт гласит:

3 .... некоторые идентификаторы зарезервированы для использования реализациями C ++ и не должны использоваться иначе;Диагностика не требуется.

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

Таким образом, наличие такого идентификатора в вашем коде приведет к неопределенному поведению.

И, как уже предлагалось в комментариях, использование макропеременных не является хорошей практикой в ​​C ++.Вместо этого вы можете использовать const int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...