gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:28:30 25 4
gpt4 key购买 nike

我正在用 C 处理以下问题。我使用全局变量在我的代码中定义一些全局参数。我希望这样的全局变量是常量,即使它们必须在从输入数据文件读取它们的值的例程中初始化。简而言之,我正在寻找一种在 C 变量初始化期间“抛弃”constness 的好方法(我想在 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;

我有一个实现 N 初始化的文件“get_global_params.c”,它将 N 视为“int N”(因为它在定义 global_params_reader 之后包含“main_header.h”)

/* 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*/);

全局.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 直接访问全局变量

关于c - 在 C 中使用宏删除(或有条件地附加)const 修饰符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23218816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com