我正在处理C中的以下问题。我使用全局变量在代码中定义一些全局参数。我希望这样的全局变量是恒定的,即使它们必须在从输入数据文件中读取其值的例程中进行初始化。简而言之,我正在寻找一种在C中的变量初始化过程中“淘汰”常量的好方法(我想在C ++中,这不会成为问题,这要归功于const_cast
)
我想出了一个基于宏的模式来做到这一点,如下图所示。看来工作正常,但我有以下问题。在下面的过程中,是否有人看到任何隐藏的缺陷或潜在的危险?有人会劝阻以下方法,而不推荐使用更简单的方法吗?
我的方法:
我有一个主头文件,其中包含我的全局变量(int N
)的定义,如下所示
/* main_header.h */
#ifdef global_params_reader
#define __TYPE__QUAL__
#else
#define __TYPE__QUAL__ const
#endif
__TYPE__QUAL__ int N;
我有一个文件“ get_global_params.c”实现了N的初始化,该文件将N视为“ int N
”(因为定义后它包括“ main_header.h” global_params_reader
)
/* get_global_params.c */
#define global_params_reader
#include get_global_params.h
void get_global_params(char* filename){
N = ... ; // calling some function that reads the value of N from
// the datafile "filename" and returns it
}
和相应的头文件“ get_global_params.h”
/* get_global_params.h */
#include "main_header.h"
void get_global_params(char* filename);
最后,我有一个main.c,它将N视为“ const int N
”(因为它包含“ main_header.h”,但未定义global_params_reader
):
/* main.c */
#include "main_header.h"
#include "get_global_params.h"
int main(int argc, char **argv){
// setting up input data file //
...
// initialize N //
get_global_params(datafile);
// do things with N //
...
}
我希望我的解释很清楚。感谢您的任何反馈。
只需将全局变量包含在单独的文件中。
globl.h:
struct Globals{
int N;
//...
};
extern const struct Globals *const globals;
init_globl.h:
init_globals(/*Init Params*/);
globl.c
#include globl.h
#include init_globl.h
static struct Globals _globals;
const struct Globals *const globals = &_globals;
init_globals(/*Init Params*/){
// Initialize _globals;
//...
}
现在,您可以在启动时通过在需要访问该功能的任何文件中包含init_globl.h来初始化全局变量,其他任何人都可以通过包含globl.h并使用符号直接访问全局变量globals->N
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句