全局数组或'#define'的"数组"的替代品?

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).

use*_*733 5

使用全局数组作为常量很好.您的预处理器常量首先是全局的.只需添加即可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)