C中全局结构中的常量变量
我试图在C中的全局结构中定义一组常量变量。到目前为止,我有一个头文件params.h: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来定义
#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:。没关系。很好,你得到答案了!