C中全局结构中的常量变量

C中全局结构中的常量变量,c,struct,header,constants,C,Struct,Header,Constants,我试图在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来定义

我试图在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

我是否错误地声明了常数?

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

正如我所见,你的值是恒定的,所以你可以使用

#define NSAMPLES 8192
和使用一样

double p[NSAMPLES];
更好的方法是,采用动态分配

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

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

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


正如其他人所说,如果您只想分配它而不使用您的结构,您仍然可以定义它。

我认为问题就在这里

双p[params.nSamples]


尽管大小处存在变量,但仍尝试在此处给出一个值

只需使用预处理器定义宏即可:定义N_SAMPLES 8*1024是否再次初始化第三个.c文件中的Params结构?因此,您告诉我,每当我要使用nSamples的值时,我都需要显式写入8*1024?如果我对8*1024个样本的值添加了几百个引用,并且在几周内我需要更改设计以处理10*1024个样本,我该怎么办?任何人如何管理大型代码库?编辑-啊,你已经编辑了你的文章。我想最接近我当前代码的应该是使用define。有没有办法用params这样的结构来定义?我正在翻译一些MATLAB代码,如果能尽可能保持结构的接近,那就太好了…@user2823789 Err。。我什么也没说。我给了你一些选择。您选择了您的。@user2823789外部常量参数;也通过看到这个。。我认为您不会在运行时更改NSAMPLE。它是永恒的!对不起,当我看到你的帖子时,它只写“是”。这意味着它应该像2,3,10,而不是像变量n:。没关系。很好,你得到答案了!