【问题标题】:Set access-modifier to a C++ #define CONSTANT_NAME constant_value将访问修饰符设置为 C++ #define CONSTANT_NAME 常量值
【发布时间】:2017-10-10 08:18:18
【问题描述】:

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

【问题讨论】:

  • 类不#include 东西,翻译单元做。 #defines 不是常量,它们是文本替换规则

标签: c++ access-modifiers


【解决方案1】:

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

你好.h

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

你好.c

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      简短回答:不。

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

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

      这意味着#includes 标头的任何编译单元都将具有两个宏和两个字符串文字的可见性。

      在 C++ 中使用宏通常被认为是糟糕的风格(包含保护除外),因为存在替代机制。如果要控制对字符串的访问,请将它们设置为类的命名成员,并具有适当的访问控制。而不是使用在头文件中声明的宏和字符串字面量。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-13
          • 2015-04-11
          • 1970-01-01
          • 2014-04-06
          • 2014-11-03
          相关资源
          最近更新 更多