使用C中的宏删除(或有条件地附加)const修饰符

翡翠武器

我正在处理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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

有条件地将模型附加到集合

来自分类Dev

是否可以将预处理器有条件地放在C宏中?

来自分类Dev

SSRS有条件地从表中删除行

来自分类Dev

有条件地定义C函数宏

来自分类Dev

如何(有条件地)使用<escape>作为修饰键

来自分类Dev

有条件地删除向量中的元素

来自分类Dev

根据泛型类型约束在Autofac中有条件地应用泛型修饰符

来自分类Dev

有条件地在Redshift中删除临时表

来自分类Dev

如何使用迭代器有条件地从列表中删除元素?

来自分类Dev

有条件地删除R中的行

来自分类Dev

Objective-c中的const修饰符

来自分类Dev

有条件地从数据框中删除

来自分类Dev

Scala:将项目添加到序列中或有条件地合并序列

来自分类Dev

有条件地在宏中调用键控参数

来自分类Dev

我可以通过可移植的方式有条件地在Makefile中定义宏吗?

来自分类Dev

如何有条件地在熊猫中删除行

来自分类Dev

Vuejs:如何有条件地附加道具?

来自分类Dev

在R中有条件地从文本文件中删除换行符

来自分类Dev

如何(有条件地)使用<escape>作为修饰键

来自分类Dev

有条件地删除向量中的元素

来自分类Dev

有条件地删除Powershell中的DataTable Row?

来自分类Dev

有条件地在angularjs中添加/删除属性

来自分类Dev

有条件地删除lisp宏中的let-binding

来自分类Dev

如何使用 sed 或 awk 等“有条件地”删除换行符?

来自分类Dev

宏中的冒号修饰符

来自分类Dev

SAS 宏 - 有条件地打印结果

来自分类Dev

有条件地删除宏

来自分类Dev

无法使用基本的 Jenkins 管道步骤有条件地删除工作区中的目录

来自分类Dev

有条件地删除 Pandas 中的重复条目

Related 相关文章

热门标签

归档