将访问修饰符设置为 C++ #define CONSTANT_NAME constant_value

Set access-modifier to a C++ #define CONSTANT_NAME constant_value

我有一个库(MyLib.hMyLib.cpp),它为某些 类(即 ClassXClassY 等)提供例程. 在 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""

两个字符串值都表明我想在何处使用每个字符串。在我看来,第一个必须只在 MyLib.cpp 代码中使用,而第二个在 ClassXClassY 等代码中使用。

C++ 是否提供了一种方法来为这两个常量定义所需的可见性?目前它们随处可见...

您通过使预处理器功能成为 #defined 常量来以这种方式使用它们。使用这种机制,它们在包含定义的任何模块中都是可见的。

您真正想要做的是在相关 类 中声明一个常量字符串(std::stringconst char*),并使用可见性控制 publicprotectedprivate 来控制它们的访问方式。

简答:没有。

字符串文字在形式上是静态存储持续时间的常量数组。只要编译器可以看到它们的定义,就无法控制它们的使用位置。并且它们的地址(或它们的任何元素的地址)可以作为参数传递给任何函数。

预处理器宏独立于范围,但存在于每个编译单元中,从它们的 #define 点到编译单元或相应的 #undef 的末尾(以先到者为准)。

这意味着 #include 属于您的 header 的任何编译单元都将具有两个宏和两个字符串文字的可见性。

在 C++ 中使用宏(include guards 除外)通常被认为是糟糕的风格,因为有替代机制。如果你想控制对字符串的访问,让它们成为你的 class 的命名成员,并具有适当的访问控制。而不是使用 header 文件中声明的宏和字符串文字。

确保您的 LOCAL_STR #define 仅在 MyLib.cpp 中使用的简单方法是将它放在那里,而不是在 MyLib.h

这不是预处理器的工作方式,无论如何,您可以单独编译每个源代码并为编译器提供宏,而不是一次编译每个文件,因此,您可以这样:

hello.h

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

hello.c

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

这可以编译为带有 -c 标志的对象,如果您将 "PREPROCESSING" 作为宏传递(使用 -D 选项),那么 hello.h 中的 ifdef将通过,定义您的字符串

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

在此之后,您可以 link 将多个 .o 文件放在一起,每个文件都定义了自己的宏而不共享它们。

如果您需要一些共享的,您可以使用另一个 .h 文件或在 ifdef 块中定义它们