【问题标题】:Extern "C" constant value is not known in .cpp but works in .cExtern "C" 常量值在 .cpp 中未知,但在 .c 中有效
【发布时间】:2016-10-04 09:48:39
【问题描述】:

在 C 文件中

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

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

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

构建输出: #259: constant value is not known

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

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

工作正常。

似乎问题出在链接上。能不能修,怎么修?这个问题是只有MDK-ARM还是其他编译器才有?

【问题讨论】:

  • 你在哪里声明 char charray[C_VAL]; ?在函数内部我们的函数外部`?
  • C 和 C++ 是不同的语言。为什么您希望它们具有相同的功能?
  • 如果你使用 gcc,你可能可以使用-std=gnu++11 或其他东西来启用扩展以支持 C++ 代码上的可变长度数组。
  • @Olaf,这是 Stroustrup 在设计 C++ 语言时的设计目标之一,即来自 C++ 的 C 代码的可用性。这是一个非常简单的例子,它展示了一些应该起作用的东西。所以我认为你的评论超出了这里的范围。在我们分享的许多问题中,我支持并关注你,但这次我不能这样做。
  • @LuisColorado:对于标准前的 C++ 和古老的 C90 来说,这可能是正确的。历史悠久的 K&R-C。特别是 const 限定符在两种语言中具有不同的语义,更不用说其他不兼容了。相同的语法并不意味着相同的语义。仅仅使用一些 C 库就会使任何问题成为 C 问题!阅读和比较标准会有所帮助!关于。 Stroustrup 曾经写道:Linus Torvalds 曾经写道,Linux 永远不会被移植到 x86 以外的任何地方......

标签: c++ keil


【解决方案1】:

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

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

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

【讨论】:

  • 我要补充一点,通常在编译时无法知道该值,因为定义C_VAL 的动态库(或其他)可以更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-23
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
相关资源
最近更新 更多