我当前的代码使用一些 #define
将所有常量放在一个 .h
文件中。
程序规范的新修改将以这种方式进行,这将要求一些常量与大小写相关,即变量将设置大小写(3 种可能),并且必须根据它使用适当的值对于其中一些常量,例如:
#define CONSTANT1 1.0F
#define CONSTANT2 2.0F
float foo(float var)
{
return (CONSTANT1 + CONSTANT2*var);
}
我目前可以想到用两种方式解决这个问题:
方式 1- 为每个可能的值设置一个 #define
,使用 3 个代码副本实现一个 switch-case
,并在每个副本中使用相应的常量
#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);
}
}
Way2- 不再将常量作为#define
,而是作为在相应文件顶部定义的全局数组,并使用选择数组中的位置
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);
}
我倾向于第二种解决方案,因为它看起来更易于维护和清洁,但使用全局数组听起来不太好。有其他选择吗?有没有办法让 #define
包含一个数组? (或类似的东西)
编辑: 我很抱歉之前没有提到。 代码必须是 C89 (ANSI C)。
最佳答案
对常量使用全局数组很好。您的预处理器常量首先已经是全局的。
只需添加 const
即可。
常量.c
const float CONSTANT1 [] = {1.0F,2.0F,3.0F};
const float CONSTANT2 [] = {2.0F,3.0F,4.0F};
constants.h
extern const float CONSTANT1 [];
extern const float CONSTANT2 [];
或者,如果您想让数组对当前编译单元私有(private),请添加 static
。
static const float CONSTANT1 [] = {1.0F,2.0F,3.0F};
关于c - 全局数组或 "array"的 '#define' 的替代品?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26527687/