将access-modifier设置为C ++ #define CONSTANT_NAME constant_value

时间:2017-05-11 11:03:02

标签: c++ access-modifiers

我有一个库(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 ++是否提供了为这两个常量定义所需可见性的方法?目前它们随处可见......

4 个答案:

答案 0 :(得分:2)

您通过这种方式使用预处理器功能#define d常量。使用此机制,无论哪个模块包含定义,它们都可见。

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

答案 1 :(得分:2)

简答:不。

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

预处理器宏与作用域无关,但在每个编译单元中从它们#define到编译单元末尾或相应的#undef(以先到者为准)存在。

这意味着#include您的标题的任何编译单元都可以看到两个宏以及两个字符串文字。

在C ++中使用宏通常被认为是不好的风格(除了包括警卫),因为有其他机制。如果要控制对字符串的访问,请使用适当的访问控制使其成为类的命名成员。而不是使用在头文件中声明的宏和字符串文字。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

这不是预处理器的工作原理,无论如何,您可以单独编译每个源并使用宏向编译器提供,而不是一次编译每个文件,因此,您可以使用以下内容:

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

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

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