Установите модификатор доступа в C ++ #define CONSTANT_NAME constant_value

У меня есть библиотека (MyLib.h а также MyLib.cpp) который предлагает подпрограммы для некоторых классов (т.е. ClassX, ClassY, так далее.).
В MyLib.h Я определил две константы с помощью #define директива препроцессора:

#define LOCAL_STR "this string can not be shared among classes that don't #include "MyLib.h""
#define TOSHARE_STR "this string can be shared among classes that #include "MyLib.h""

Обе строки значения предлагают, где я хотел бы использовать каждую строку. На мой взгляд, 1-й должен использоваться только в MyLib.cpp код, а 2-й внутри ClassX, ClassYи т. д. код.

Предоставляет ли C ++ способ определения желаемой видимости для этих двух констант? В настоящее время они видны везде …

1

Решение

Простой способ убедиться, что ваш LOCAL_STR #define используется только в MyLib.cpp, это поместить его туда, а не в MyLib.h.

1

Другие решения

Вы используете таким образом возможности препроцессора, делая их #defineд константы. Используя этот механизм, они видны в любом модуле, включающем определение.

Что вы действительно хотите сделать, это объявить константную строку (std::string или же const char*) в соответствующих классах и использовать элементы управления видимостью public, protected а также private контролировать, как они доступны.

2

Краткий ответ: нет.

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

Макросы препроцессора не зависят от области видимости, но существуют в каждом модуле компиляции с точки зрения их #define до конца блока компиляции или соответствующего #undef (что наступит раньше).

Это означает, что любой модуль компиляции, который #includes в вашем заголовке будут видны оба макроса и оба строковых литерала.

Использование макросов в C ++ часто считается плохим стилем (за исключением включения защиты), поскольку существуют альтернативные механизмы. Если вы хотите контролировать доступ к строкам, сделайте их именованным членом вашего класса с соответствующим контролем доступа. Вместо использования макросов и строковых литералов, объявленных в заголовочных файлах.

2

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

hello.h

#ifdef PREPROCESSING
#define STR "this is only seen in hello.c"#endif

Привет

#include "hello.h"/* STR == "this is ...." */

Это может быть скомпилировано как объект с -c flag и, если вы передадите «PREPROCESSING» в качестве макроса (с опцией -D), то ifdef в hello.h пройдет, определяя вашу строку

gcc -c -DPREPOROCESSING hello.c -o hello.o

После этого вы можете связать несколько файлов .o вместе, каждый из которых определит свои собственные макросы, не разделяя их.

Если вам нужны общие файлы, вы можете использовать еще один файл .h или определить их в блоке ifdef.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector