【问题标题】:use variables from a C generated file使用 C 生成文件中的变量
【发布时间】:2021-04-15 11:10:23
【问题描述】:

我生成了一个 C 文件,其中包含一些数组,它们的大小如下:

nor.c(生成的文件)

const float nor[] = {
-0.0972819, 0.906339, -0.4112, -0.056471, 0.340899, -0.938402, -0.284611, 0.269598, -0.919953, 0.04142, -0.149024, -0.987966, 0.12454, -0.702485, -0.700717, 0.0027959, -0.188166, -0.982133 };

const unsigned int nor_size= 18;

当我从我的主文件中调用这个数组时,如下所示:

extern float nor[nor_size];

我遇到了一些错误:不能使用 nor_size 作为 const

如何解决?

谢谢

【问题讨论】:

  • 你为什么不首先生成const float nor[size]
  • 不要在主文件中使用extern,它属于头文件
  • 你需要这个尺寸吗?对于extern 声明,它并不是真正需要的,如果您想计算大小,您可以根据nor_size 而不是sizeof 进行计算。
  • 花点时间创建一个minimal reproducible example 并在问题中发布确切的错误消息
  • 您是否将这两个 C 文件都添加到您的项目中?如果允许您改进该软件,那么首先让它创建我们正在谈论的那个 h 文件怎么样? ;)

标签: arrays c


【解决方案1】:

如何解决?

nor.c文件的生成器最好也生成对应的nor.h文件

#ifndef NOR_INCLUDE_GUARD
#define NOR_INCLUDE_GUARD

extern const float nor[18];
extern const unsigned int nor_size;

#endif

main.c 使用那个 .h 文件

// Rather than
// extern float nor[nor_size];

// Include
#include "nor.h"

还建议 nor.c 文件的生成器为每个常量附加一个f 后缀。

【讨论】:

  • 我不用h文件
  • @Gigo "我不必使用 h 文件" --> 好的,所以您不必使用 .h 文件,但它仍然是使用的最佳方法。
  • 我认为c文件不在路径中,这就是为什么我在调用extern时出错
  • @Gigo “不必使用 h 文件”是否意味着您“没有可以使用的 h 文件”或“没有特别要求使用 h 文件”?
  • @Gigo 那么在被提及几次之后,您也不会被阻止使用h文件。那么,是什么阻止你这样做呢?
【解决方案2】:

在您的main.c 中删除 extern float nor[nor_size]; 然后添加

extern const float nor[];
extern const unsigned int nor_size;

并酌情使用它们。实际上,nor_size 可能会被加载(在机器代码级别的 processor registers 中)多次。

如需了解更多信息,请阅读this C reference,然后阅读一些 C 标准,如 n1570 或更好的标准。

如果允许您使用最近的 GCC 编译器(或交叉编译器)编译所有 C(手写和生成)代码,请至少调用它 with-Wall -Wextra -g 选项。

别忘了阅读 C 编译器的文档!

您还需要了解您的linker 是什么,并阅读其文档。也许是GNU binutils

您可以使用一些静态源代码分析器,例如Clang static analyzerFrama-CBismon。仅供参考,Bismon 有 24604 行生成的 C 代码,Bigloo 编译器也有很多。

对于 Frama-C 或 Bismon,请通过电子邮件与我联系basile.starynkevitch@cea.fr 并提及您问题的 URL

还可以阅读一本不错的 C 编程书籍,例如 Modern C

在 2021 年,您可能会对 DECODER 项目感兴趣。这与您的问题密切相关。

Pitrat 的Artificial Beings: the Conscience of a Conscious Machine (ISBN 978-1848211018) 是一本有趣的书,描述了一种软件,该软件生成所有其 C 源代码的 50 万行代码(here 可用)。你会喜欢读那本书的。

另见this answer关于生成C代码。

您也可以通过GNU bison 感兴趣。它是一个free softwareparser generator,主要是用C编写的,生成C代码。我的建议是下载它的源代码并从中汲取灵感。

根据经验,当您生成 C 代码时,更容易改进生成器(以便生成的 C 代码可以干净地编译而不会发出警告)来更改生成的 C 代码。但是一定要记录好你的 C 代码生成器。阅读partial evaluation 技术。

【讨论】:

  • 不行,我认为编译器看不到我生成的c文件
  • 这意味着你错误地使用了你的编译器。你读过编译器的文档吗?
  • 我用的是visual studio编译器(VS2019)
  • 为什么我必须阅读它的文档,我编写代码然后编译器会完成这项工作
  • 没有必要在每篇文章中都包含一个包含几乎没有主题工具建议的巨大附录。新手将不会从静态分析器和其他更高级的工具中受益,恰恰相反。
猜你喜欢
  • 2013-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多