Fed*_*ico 0 c arrays c-preprocessor
我当前的代码使用一些#defines将所有常量都放在一个.h文件中.
程序规范的一个新修改就是这样,这将需要一些常量依赖于大小写,即变量将设置大小写(可能是3个),并且根据它,必须使用适当的值.这些常数,例如:
#define CONSTANT1 1.0F
#define CONSTANT2 2.0F
float foo(float var)
{
return (CONSTANT1 + CONSTANT2*var);
}
Run Code Online (Sandbox Code Playgroud)
我现在可以想到以两种方式解决这个问题:
Way1- #define对每个可能的值都有一个,实现一个switch-case带有3个代码的代码,并在每个代码中使用相应的常量
#define CONSTANT1_a 1.0F
#define CONSTANT2_a 2.0F
#define CONSTANT1_b 2.0F
#define CONSTANT2_b 3.0F
#define CONSTANT1_c 3.0F
#define CONSTANT2_c 4.0F
switch(var_case)
{
case 0:
float foo(float var)
{
return (CONSTANT1_a + CONSTANT2_a*var);
}
case 1:
float foo(float var)
{
return (CONSTANT1_b + CONSTANT2_b*var);
}
case 2:
float foo(float var)
{
return (CONSTANT1_c + CONSTANT2_c*var);
}
}
Run Code Online (Sandbox Code Playgroud)
Way2-常量不再是#defines,而是作为全局数组定义在相应文件的顶部,并且具有单个实现的代码,其中"case"选择数组中的位置
float CONSTANT1 [] = {1.0F,2.0F,3.0F};
float CONSTANT2 [] = {2.0F,3.0F,4.0F};
float foo(float var)
{
return (CONSTANT1[var_case] + CONSTANT2[var_case]*var);
}
Run Code Online (Sandbox Code Playgroud)
我倾向于第二种解决方案,因为它似乎更加可维护和干净,但使用全局数组听起来并不是很好.还有其他选择吗?有没有办法#define包含一个数组?(或等同的东西)
编辑: 我为之前没有提到道歉.代码必须是C89(ANSI C).
使用全局数组作为常量很好.您的预处理器常量首先是全局的.只需添加即可const.
constants.c
const float CONSTANT1 [] = {1.0F,2.0F,3.0F};
const float CONSTANT2 [] = {2.0F,3.0F,4.0F};
Run Code Online (Sandbox Code Playgroud)
constants.h
extern const float CONSTANT1 [];
extern const float CONSTANT2 [];
Run Code Online (Sandbox Code Playgroud)
或者,如果要将数组专用于当前编译单元,请添加static.
static const float CONSTANT1 [] = {1.0F,2.0F,3.0F};
Run Code Online (Sandbox Code Playgroud)