Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 全局数组的替代方案或;数组";属于'#定义';s_C_Arrays_C Preprocessor - Fatal编程技术网

C 全局数组的替代方案或;数组";属于'#定义';s

C 全局数组的替代方案或;数组";属于'#定义';s,c,arrays,c-preprocessor,C,Arrays,C Preprocessor,我当前的代码使用一些#defines将所有常量都放在一个.h文件中 程序规范的一个新修改是这样来的,这将要求一些常数取决于大小写,即一个变量将设置大小写(可能为3个),根据它,必须为其中一些常数使用适当的值,例如: #define CONSTANT1 1.0F #define CONSTANT2 2.0F float foo(float var) { return (CONSTANT1 + CONSTANT2*var); } 我目前可以用两种方法来解决这个问题: 方式1-为每个可能的

我当前的代码使用一些
#define
s将所有常量都放在一个
.h
文件中

程序规范的一个新修改是这样来的,这将要求一些常数取决于大小写,即一个变量将设置大小写(可能为3个),根据它,必须为其中一些常数使用适当的值,例如:

#define CONSTANT1 1.0F
#define CONSTANT2 2.0F

float foo(float var)
{
    return (CONSTANT1 + CONSTANT2*var);
}
我目前可以用两种方法来解决这个问题:

方式1-为每个可能的值定义一个
#
,使用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);
     }
}
Way2-将常量不再作为
#define
s,而是作为在相应文件顶部定义的全局数组,并使用选择数组中位置的“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);
}
我倾向于第二种解决方案,因为它看起来更易于维护和清洁,但使用全局阵列听起来并不好。还有别的选择吗?有没有办法让
#define
包含数组?(或类似的东西)

编辑: 我很抱歉之前没有提及。
代码必须是C89(ANSI C)。

我现在无法验证这一点,但这可能会起作用:define宏可以是数组,也可以是几乎任何东西。这样做:

#define CONSTANTS int temp[]={1,2,3,4};
//.. Later..
int x = (CONSTANTS)[2];
#define所做的一切就是对编译器说:在编译之前,用后面的任何内容(在本例中为“temp[]={1,2,3,4}”)替换定义常量(在本例中为常量)代码中的每个实例。因此,上面的代码将编译为

int x = (temp[]={1,2,3,4})[2];

但这变得不可靠,因为temp必须是该范围内的保留变量名。我建议使用开关或standin变量加上两个三元条件来表示一行程序。

对常量使用全局数组是可以的。您的预处理器常量首先已经是全局的。 只需添加
const
即可

常数.c

const float CONSTANT1 [] = {1.0F,2.0F,3.0F};
const float CONSTANT2 [] = {2.0F,3.0F,4.0F};
常数.h

extern const float CONSTANT1 [];
extern const float CONSTANT2 [];
或者,如果要使数组成为当前编译单元的私有数组,请添加
static

static const float CONSTANT1 [] = {1.0F,2.0F,3.0F};

请在您想到的每种方法中添加一个相关的编码示例。很难理解你对每种情况的确切意图。复合文字:
#define ARRAY((const char*[]){“零”、“一”、“二”、“三”})
这是一个运行时开关?@BLUEPIXY,我刚开始考虑用这个来写一个答案。您唯一缺少的是,我认为是将类型
const
-限定为
(char-const*const[]){…}
,这让编译器有更多的自由。@JensGustedt是的,我忘记了
const
“…数组对当前编译单元是私有的,添加静态”如果它们对一个编译单元是私有的,我可以跳过
.h
文件中的
extern
行,对吗?@Federico是的,不需要头。这将不会编译,因为在预处理代码后会像这样:
intx=(inttemp[]={1,2,3,4};)[2]。如果您打算使用复合文本,那么应该是:
#定义常量((const int[]){1,2,3,4})
,但它也不会编译,因为复合文本在C89下不可用。