Extern "C" 常量值在 .cpp 中未知,但在 .c 中有效

Extern "C" constant value is not known in .cpp but works in .c

在 C 文件中

// f1.c
const uint8_t C_VAL=2;`  

在 C++ 文件中我声明了简单数组

// f2.cpp
extern "C" const uint8_t C_VAL;
char charray[C_VAL];

Build output: #259: constant value is not known

我link extern in .C

时没有任何错误
// f2.c
extern const uint8_t C_VAL;
char charray[C_VAL];

工作正常。

似乎问题出在link年龄上。能修吗,怎么修?是MDK-ARM才有这个问题还是其他编译器也有?

C 支持可变长度数组(从 C99 开始,但从 C11 开始只是可选的。一些早期的编译器支持它们作为语言扩展),所以 C_VAL 的值当时不需要知道f2.c 已编译,因此没有问题。

C++ 不支持可变长度数组(除了某些编译器支持它们作为语言扩展),因此 C_VAL 的值必须在编译 f2.cpp 时已知。由于它只是被声明,它的值是未知的,这就是编译器向您显示引用错误的原因。在将 f2.cppf1.c 的目标文件链接在一起之前,该值仍然未知。

解决方法:要么使用支持VLA的语言(比如C99),要么使用支持VLA的编译器作为扩展(看你的编译器的手册是否支持,以及如何启用支持)或者定义长度在编译时已知的数组。