【问题标题】:Const variable in a global struct in CC中全局结构中的常量变量
【发布时间】:2014-01-07 12:11:42
【问题描述】:

我正在尝试在 C 中的全局结构内定义一组常量变量。到目前为止,我有一个头文件“params.h”:

#ifndef PARAMS_H_INCLUDED
#define PARAMS_H_INCLUDED

typedef struct Params_s {

    const int nSamples;
    //Some other constants here...

} Params;

extern const Params params;

#endif

我还有一个文件“params.c”来定义我的常量:

#include "params.h"

Params params = {

    8*1024, // nSamples
    //Some other constants here...

}

当我尝试使用这些常量来定义诸如数组大小之类的东西时,就会出现我的问题。如果,在第三个 .c 文件中,我写:

#include "params.h"

//...Code here...

double p[params.nSamples];

然后我在数组大小上出现以下错误:

IntelliSense: expression must have a constant value

我是否错误地声明了我的常量?

【问题讨论】:

  • 只使用预处理器定义(宏)代替:#define N_SAMPLES (8*1024)
  • 是否再次初始化第三个.c文件中的Params结构?

标签: c struct header constants


【解决方案1】:

是的。这意味着它应该使用像 2, 3, 10 这样的值,而不是像变量 n

我可以看到你的价值是不变的,所以你可以使用

#define NSAMPLES 8192

并像使用一样

double p[NSAMPLES];

更好的办法是动态分配

double* p = malloc(sizeof(double)*params.nSamples);

【讨论】:

  • 所以你告诉我每次我想使用nSamples的值,我需要明确写8*1024?如果我添加了几百个对 8*1024 样本值的引用,并且在几周内我需要更改设计以处理 10*1024 样本,我该怎么办?有人如何管理大型代码库?编辑 - 啊,你已经编辑了你的帖子。我想最接近我当前代码的是使用#define。有没有办法用像参数这样的结构来做#define?我正在翻译一些 MATLAB 代码,最好保持结构尽可能接近...
  • @user2823789 Err.. 我什么都没说。我给了你几个选择。你选择了你的。
  • @user2823789 extern const Params params; 也看到这个.. 我不认为你会改变 nSamples 运行时间。它是恒定的!
  • 对不起,当我看到你的帖子时,它只显示“是的。这意味着它应该像 2、3、10 而不是像变量 n”
  • :)。没关系。很好,你得到了答案!
【解决方案2】:

在 C89 中,您不能声明具有可变长度的数组。如果你想这样做,你必须通过malloc或类似的函数自己分配它,然后释放你的内存。

如果您仍然想这样做,您可以使用 C99,例如在 gcc 上使用标志 --std=c99 进行编译。它将允许您声明这样的数组。

正如其他人所说,如果您只是想在不使用结构的情况下分配它,您仍然可以创建 #define

【讨论】:

    【解决方案3】:

    我认为问题就在这里

    双 p[params.nSamples];

    尽管大小位置存在变量,但尝试在那里给出一个值

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-27
      • 1970-01-01
      • 2016-02-03
      • 1970-01-01
      相关资源
      最近更新 更多