我知道以下是有效代码:
#define SOMEMACRO 10
int arr[SOMEMACRO];
将导致int arr[10]
。
如果我想制作一个2x大小的数组(并且仍然需要其他地方的原始宏),这个有效的代码是什么?
#define SOMEMACRO 10
int arr[2 * SOMEMACRO];
预编译后为int arr[2 * 10]
。这仍然被编译器视为常量表达式吗?
快速查看之后似乎有效,但这是定义的行为吗?
答案 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];
因为这不是一个常数。但是你写的是一个常数,所以你很高兴