将访问修饰符设置为 C++ #define CONSTANT_NAME constant_value
Set access-modifier to a 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""
两个字符串值都表明我想在何处使用每个字符串。在我看来,第一个必须只在 MyLib.cpp
代码中使用,而第二个在 ClassX
、ClassY
等代码中使用。
C++ 是否提供了一种方法来为这两个常量定义所需的可见性?目前它们随处可见...
您通过使预处理器功能成为 #define
d 常量来以这种方式使用它们。使用这种机制,它们在包含定义的任何模块中都是可见的。
您真正想要做的是在相关 类 中声明一个常量字符串(std::string
或 const char*
),并使用可见性控制 public
,protected
和 private
来控制它们的访问方式。
简答:没有。
字符串文字在形式上是静态存储持续时间的常量数组。只要编译器可以看到它们的定义,就无法控制它们的使用位置。并且它们的地址(或它们的任何元素的地址)可以作为参数传递给任何函数。
预处理器宏独立于范围,但存在于每个编译单元中,从它们的 #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 块中定义它们
我有一个库(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""
两个字符串值都表明我想在何处使用每个字符串。在我看来,第一个必须只在 MyLib.cpp
代码中使用,而第二个在 ClassX
、ClassY
等代码中使用。
C++ 是否提供了一种方法来为这两个常量定义所需的可见性?目前它们随处可见...
您通过使预处理器功能成为 #define
d 常量来以这种方式使用它们。使用这种机制,它们在包含定义的任何模块中都是可见的。
您真正想要做的是在相关 类 中声明一个常量字符串(std::string
或 const char*
),并使用可见性控制 public
,protected
和 private
来控制它们的访问方式。
简答:没有。
字符串文字在形式上是静态存储持续时间的常量数组。只要编译器可以看到它们的定义,就无法控制它们的使用位置。并且它们的地址(或它们的任何元素的地址)可以作为参数传递给任何函数。
预处理器宏独立于范围,但存在于每个编译单元中,从它们的 #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 块中定义它们