倍增宏我知道下面是合法的代码:使用数组声明
#define SOMEMACRO 10
int arr[SOMEMACRO];
这将导致作为int arr[10]
。
如果我想制作一个2x大小的数组(并且仍然需要其他地方的原始宏),这个有效的代码是什么?
#define SOMEMACRO 10
int arr[2 * SOMEMACRO];
预编译后会是int arr[2 * 10]
。这仍然被编译器视为常量表达式吗?
快速查看后,它似乎工作,但这是定义的行为?
倍增宏我知道下面是合法的代码:使用数组声明
#define SOMEMACRO 10
int arr[SOMEMACRO];
这将导致作为int arr[10]
。
如果我想制作一个2x大小的数组(并且仍然需要其他地方的原始宏),这个有效的代码是什么?
#define SOMEMACRO 10
int arr[2 * SOMEMACRO];
预编译后会是int arr[2 * 10]
。这仍然被编译器视为常量表达式吗?
快速查看后,它似乎工作,但这是定义的行为?
难道这仍被视为由编译器常量表达式?
是的。这是常量表达式和文字之间的区别:常量表达式不一定是文字,它可以是任何可以在编译时计算其值的表达式(即文字或其他常量表达式的组合) 。
(只是为了清楚起见。当然文字仍然被认为是常量表达式)
然而,在C中,阵列的大小不必是一个编译时间常数。 C99和C11支持可变长度阵列(VLA),因此
size_t sz = // some size calculated at runtime;
int arr[sz];
也是有效的C.
是的,只要它是一个有效的数字,它就是一个常量表达式。 如果你说它的工作,那么你知道编译器工作得很好。
如你所知,我们不能做
int x;
scanf("%d", &x);
int arr[2 * x];
,因为这是没有一个常数。但你写的是一个常数,所以你很好走
是的,你可以使用这个表达式。它不会导致UB。
注意,阵列subcript可以是整数表达式:
#define i 5
#define j 4
int a[i+j*10] = 0;
的下标i+j*10
的值将在编译期间被计算。
向下选民留下您的评论... – haccks
是的,它会工作.MACRO将被放置在编译的位置,所以a[2*SOMEMACRO]
将变成a[2*10]
这是完全有效的。
要检查什么是预处理可以使用cc -E foo.c
选项
是的,这是在编译时评估并用作常量。 – Unknown