c++ - 如何将 char 数组定义为常量?

标签 c++ c arduino constants

这里是 C/C++ 菜鸟。我已经在头文件中定义了它...

typedef unsigned char BitChar[9]; // 8 data bytes (chars) and one width byte (char)

extern BitChar BitFont[];

我把它放在一个 cpp 文件中...

BitChar BitFont[] = {
    B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,2, // 32 - Space
    B10000000,B10000000,B10000000,B10000000,B10000000,B00000000,B10000000,B00000000,1, // 33 - !
    ...
    B00000000,B00000000,B11100000,B11100000,B11100000,B00000000,B00000000,B00000000,3, // 127 - Unknown
};

它编译并且看起来运行得很好。然而,由于它永远不会改变,我认为它应该被标记为常量。我该如何标记它?我所期望的是,添加“const”会引发编译错误,所以我很困惑。这是错误...

error: invalid initialization of reference of type 'unsigned char (&)[9]' from expression of type 'const unsigned char [9]' 

最佳答案

只需添加const。这个

extern const BitChar BitFont[];
...
const BitChar BitFont[] = {
    B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,2, // 32 - Space
    B10000000,B10000000,B10000000,B10000000,B10000000,B00000000,B10000000,B00000000,1, // 33 - !
    ...
    B00000000,B00000000,B11100000,B11100000,B11100000,B00000000,B00000000,B00000000,3, // 127 - Unknown
};

在 C 中应该可以很好地工作。(假设您的编译器知道这些 B00000000 标识符的含义。)

这在 C++ 中也能完美运行。 C++ 版本中唯一可能的错误是基于 const 的 C++ 特定属性。如果定义没有看到声明,那么你必须在定义中指定显式 extern

extern const BitChar BitFont[] = {
    B00000000
    ...

因为在 C++ 中,const 对象默认具有内部 链接。但是,如果声明中已经包含extern并且定义可以看到声明,那么定义中的那个extern是可选的。

您引用的错误消息表明您在代码中的某处尝试初始化类型为 BitChar & 的引用(又名 unsigned char (&)[9])带有 const 限定的 BitChar 数组。这是行不通的,因为它违反了 const-correctness 的基本规则。引用也必须成为 const 限定的,即它必须更改为 const BitChar &(又名 const unsigned char (&)[9])。

关于c++ - 如何将 char 数组定义为常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25320790/

相关文章:

c - 不使用内置函数计算数组大小

c++ - 如果模板参数也提供比较运算符,则有条件地提供比较运算符的重载

c++ - 为什么我不能在 struct 中初始化 char 数组

使用 Poco 库的 C++/IOS Websockets

c++ - 如何保护 Linux 中的堆内存?

c - 包括 32 位变量的前导零,通过 Arduino Uno 板上的串行端口发送

c - 我试图让一个字符串只接受字母和空格,但不接受数字

c - 如何动态获取整数输入并让循环在按回车键时终止?

php - 从 mysql 中检索数据并从 php 中输出 json

c - 奇怪的变量行为 - Arduino Uno rev 3