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

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

本文关键字:CONSTANT #define NAME value constant C++ 访问 设置      更新时间:2023-10-16

我有一个库(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标头的任何编译单元都将可以看到两个宏和两个字符串文本。

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

确保你的LOCAL_STR #define只在MyLib中使用.cpp的简单方法是把它放在那里,而不是放在MyLib中。

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

你好,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块中定义它们