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

标签 c arrays c-preprocessor

我当前的代码使用一些 #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/

相关文章:

c# - 为什么我们不能在 C# 中执行 'if (object)' 来测试对象是否为空?

c - 客户端装饰如何与 Gnome 3.10 和 GTK 3 配合使用?

带有 ASP.Net Web API 的 C# Entity Framework 6 在 JSON 响应中返回空数组

C - 只有一个指针坐标相加,其余等于0

c++ - 伪造真↔假

c - pow 函数的奇怪行为

java - 比较两个数组时遇到问题

c++ - 在 C++ 头文件/实现文件中放置#undef 指令的正确方法

c - for 循环宏代码风格

c - 为什么 GCC 不优化结构?