我有一个库(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 ++是否提供了为这两个常量定义所需可见性的方法?目前它们随处可见......
答案 0 :(得分:2)
您通过这种方式使用预处理器功能#define
d常量。使用此机制,无论哪个模块包含定义,它们都可见。
您真正想要做的是在相关类中声明一个常量字符串(std::string
或const char*
),并使用可见性控件public
,protected
和{ {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块中定义它们