【发布时间】:2021-09-14 06:37:11
【问题描述】:
当我尝试执行以下函数时出现此错误
src\main.c(41): error: #259: constant value is not known
代码:
uint8_t checksum_tx(uint64_t Data, uint8_t dataLength, uint8_t checksum_len ) {
const uint8_t length = (dataLength + checksum_len - 1) / checksum_len;
//** splitting data into 6-bits subunits . . .
uint8_t res = 0U;
uint8_t dataSubUnit[length];
导致错误的行
const uint8_t length = (dataLength + checksum_len - 1) / checksum_len;
有人可以澄清发生了什么问题吗? 我在某处读到C中的常量必须直接声明,不允许初始化它们,我想这就是我所做的。
【问题讨论】:
-
常量在编译期间进行评估。在您的情况下,您使用函数参数来定义它,但编译器不知道它们的值
-
您使用的是什么编译器/操作系统?在 C17 中,
const变量不是其值在编译时已知的变量;相反,const基本上意味着它的值一旦被初始化就不能被修改。这就是为什么dataSubUnit不是静态数组,而是 VLA(即:在运行时知道其维度的数组,并将在堆栈上分配),但并非所有编译器都支持 VLA。 -
欢迎来到 StackOverflow!请拨打tour 并阅读“How to Ask”以了解本网站的运作方式。 -- 我们真的需要知道你使用的是哪个编译器。标准编译器对您的初始化常量变量没有问题,即使是带有“-std=c90”的 GCC。最好edit您的问题,并提供minimal reproducible example,重点是“完整”。
-
请尝试发布语法正确的代码,最好是How to create a Minimal, Reproducible Example中推荐的完整示例所以我们不需要更正代码来查看编译器产生的错误(可能我们得到您犯的错误,或其他错误,或根本没有)。这意味着您的函数头必须通过左花括号等与主体分开。
-
感谢您的反馈,以后我会尝试发布更易于理解的问题。