将访问修饰符设置为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
标头的任何编译单元都将可以看到两个宏和两个字符串文本。
在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块中定义它们
- 为什么static_assert错误:即使我传递常量"expression must have a constant value"?
- 与C代码相比,为什么C++代码不需要"#define _POSIX_C_SOURCE 200809L"?
- 以下 C++ 代码用于 -> "#define idiv(a, b) (((a) + (b) / 2) / (b))" 是什么?
- 如何以静态代码分析友好的方式使用 #define 防护?
- C++相当于整数的 #define
- #define Dbg(fmt,..) (0) 是什么意思? 警告:表达式无效
- 在C++中使用变量而不是"#define"来指定数组大小是不是一种糟糕的做法?(C错误:在文件范围内
- 我们可以用 C 语言嵌套 #define 和 #if 吗?
- 如何将旧的 C 样式 #define 映射与现代C++进行调整?
- 找不到 #define 的函数定义
- "#define X X"是什么意思?
- 使用 constexpr 替换 #define 和 #ifdef 进行条件编译
- 野牛/flex:计算器将双精度值解释为整数,所以我添加了 YYSTYPE 双精度 #define 但我有多个编译错误
- 如何解决C++中声纳库贝静态代码分析错误"Explicitly define the missing copy constructor, move constructor .."
- c中 #define 的不足
- 使用 [#define & #ifdef] 跨文件激活代码块
- 为什么在main()之前断言会导致语法错误"error: expected ')' before numeric constant"?
- 如何避免#define语法的变量重新声明
- 使用 GCC 对 C 文件进行部分预处理(不删除 "define" 指令)
- 即使我没有 #define 任何东西或错过分号,如何修复"expected unqualfied-id before string constant"?