AVR / Linux GCC c++项目的常用常量
Common constants for an AVR / Linux GCC C++ project
我正在为Linux + AVR Arduino项目创建软件。很明显,整个工作在Eclipse中分成几个项目(我没有使用Arduino IDE)。我想在所有项目中使用常见的,主要是字符串常量。我还必须节省微控制器的RAM,因此需要编译时常数。我如何最好地实现它?我的想法是为这些常量创建一个单独的、只有头文件的项目。
使用:class A {
public:
static const char * const STRING;
static const unsigned char BOOL;
};
不够好,因为我希望能够像这样连接字符串常量:
class A {
public:
static const char * const STRING_PART1;
static const char * const STRING_PART2;
static const unsigned char BOOL;
};
const char * const A::STRING_PART1 = "PART1_";
//const char * const A::STRING_PART2 = A::STRING_PART1 + "PART2"; //obviously won't compile
//const char * const A::STRING_PART2 = strcat("PART2", A::STRING_PART1); //this is not compile-time
我也不想使用define
。我想使用:
class A {
public:
static const std::string STRING_PART1;
static const std::string STRING_PART2;
}
允许字符串连接,并且(AFAIK)是编译时的,但是std::string在avr项目中不可用-或者我在这里错了,只是不知道如何使用它。
感谢您的帮助。
您可以继续使用const char* const
的当前想法(如果std::string
不可用)。我建议仅将#define
用于分配目的。例子:
class A {
public:
static const char * const STRING_PART1;
static const char * const STRING_PART2;
static const unsigned char BOOL;
};
#define PART1_ "PART1_" // <--- for value assignent
#define PART2_ "PART2_"
const char * const A::STRING_PART1 = PART1_;
const char * const A::STRING_PART2 = PART1_ PART2_; // <--- ok! concatenation by compiler
编译时间对我来说意味着它是存储在ROM(例如。微控制器的闪存),其中运行时变量存储在RAM中。在我的例子中,我必须腾出RAM。编译器根据许多规则来决定把变量放在哪里。定义是编译时常量的一个例子,它们显然不计入RAM使用。另一个例子应该是静态类常量——但在这种情况下,我的编译器另有决定。当然,我可能把事情搞混了。
我认为你实际上混淆了事情:
- 定义不存储在ROM中——它们根本不是程序的一部分,因为它们已经被预处理器计算过了。
- "编译时"answers"运行时"的区别适用于计算,而不是存储。
如果你想使用程序内存(= AVR闪存)为常量字符串,使用PSTR宏从AVR/pgmspace.h.
相关文章:
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 什么时候在C++中返回常量引用是个好主意
- 代理对象的常量正确性
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 通过多个头文件使用常量变量
- 在cuda线程之间共享大量常量数据
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 是默认情况下分配给char数组常量的值
- 私有类型的静态常量成员
- 类似枚举的计算常量
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 为什么我可以通过引用修改常量返回
- 如何创建长度由常量参数指定的数组
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 隐式常量/非常量运算符布尔
- 非常量变量只读位置的赋值
- AVR / Linux GCC c++项目的常用常量