在数组声明中使用乘法宏

时间:2013-07-30 10:26:42

标签: c arrays macros

我知道以下是有效代码:

#define SOMEMACRO 10
int arr[SOMEMACRO];

将导致int arr[10]

如果我想制作一个2x大小的数组(并且仍然需要其他地方的原始宏),这个有效的代码是什么?

#define SOMEMACRO 10
int arr[2 * SOMEMACRO];

预编译后为int arr[2 * 10]。这仍然被编译器视为常量表达式吗?

快速查看之后似乎有效,但这是定义的行为吗?

4 个答案:

答案 0 :(得分:2)

是的,它会起作用.MACRO将在编译时放置,因此a[2*SOMEMACRO]将成为a[2*10],这完全有效。

要检查预处理的内容,您可以使用cc -E foo.c选项

答案 1 :(得分:1)

是的,您可以使用此表达式。它不会导致UB 请注意,数组子标记可以是整数表达式

#define i  5 
#define j  4
int a[i+j*10] = 0;

下标i+j*10的值将在编译期间计算。

答案 2 :(得分:1)

  

这仍然被编译器视为常量表达式吗?

是。这是常量表达式和文字之间的区别:常量表达式不必是单个字面值,它可以是在编译​​时可以计算值的任何表达式(即文字的组合)或其他常量表达式。)

(仅为了清晰起见:当然文字仍被视为常量表达式。)

但是,在C中,数组的大小不必是编译时常量。 C99和C11支持可变长度数组(VLA),所以

size_t sz = // some size calculated at runtime;
int arr[sz];

也是有效的C.

答案 3 :(得分:0)

是的,只要它是有效数字,它就是一个常量表达式。 如果你说它有效,那么你就知道编译器工作得很好。

如你所知,我们做不到

int x;
scanf("%d", &x);
int arr[2 * x];

因为这不是一个常数。但是你写的是一个常数,所以你很高兴