C++ 外部“C”常量值在.cpp中未知,但在.C中有效

C++ 外部“C”常量值在.cpp中未知,但在.C中有效,c++,keil,C++,Keil,在C文件中 // f1.c const uint8_t C_VAL=2;` 在C++文件中,我声明简单数组< /p> // f2.cpp extern "C" const uint8_t C_VAL; char charray[C_VAL]; 生成输出: 259:常量值未知 在.C中链接extern时没有任何错误 // f2.c extern const uint8_t C_VAL; char charray[C_VAL]; 很好 问题似乎出在联系上。是否有可能修复,如何修复?这个问题

在C文件中

// f1.c
const uint8_t C_VAL=2;`  
在C++文件中,我声明简单数组< /p>
// f2.cpp
extern "C" const uint8_t C_VAL;
char charray[C_VAL];
生成输出: 259:常量值未知

在.C中链接extern时没有任何错误

// f2.c
extern const uint8_t C_VAL;
char charray[C_VAL];
很好


问题似乎出在联系上。是否有可能修复,如何修复?这个问题是否仅在MDK-ARM或其他编译器中存在?

C自C99起就支持可变长度数组,但自C11起仅可选。一些早期的编译器支持将其作为语言扩展,因此在编译f2.C时不需要知道C_VAL的值,因此不存在问题

C++不支持可变长度数组,但某些编译器支持将其作为语言扩展,因此C_VAL的值必须在编译f2.cpp时已知。因为它只是声明的,所以它的值是未知的,这就是编译器向您显示引用错误的原因。在将f2.cpp和f1.c的对象文件链接在一起之前,该值始终未知


解决方案:要么使用支持VLA的语言(如C99),要么使用支持VLA作为扩展的编译器。请参阅编译器手册,了解它是否支持VLA,以及如何启用该支持或使用编译时已知的长度定义数组。

您在何处声明char charray[C_VAL]?在函数的内部,函数C和C++的外部是不同的语言。为什么你期望它们具有相同的特性?如果你使用GCC,你可能会使用-STD= GNU+++ 11或其他东西,使扩展能够支持C++代码上的可变长度数组。@奥拉夫,这是C++设计语言的设计目标之一,C++代码的可用性。这是一个非常简单的例子,说明了一些应该有效的方法。所以我认为你的评论超出了范围。我在很多问题中都支持和跟踪你,但我不能这么做。@路易斯科拉多:对于标准的C++和古C90,RESP可能是正确的。历史上的K&R-C。特别是const限定符在两种语言中具有不同的语义,更不用说其他不兼容了。相同的语法并不意味着相同的语义。只要使用一些C库,任何问题都会变成C问题!阅读和比较这些标准很有帮助!重新。Stroustrup曾经写道:Linus Torvalds曾经写道,Linux永远不会被移植到x86之外的任何东西……我要补充的是,这个值通常在编译时是未知的,因为动态库或任何定义C_VAL的地方都会发生变化。