2013-07-30 55 views
1

倍增宏我知道下面是合法的代码:使用数组声明

#define SOMEMACRO 10 
int arr[SOMEMACRO]; 

这将导致作为int arr[10]

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

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

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

快速查看后,它似乎工作,但这是定义的行为?

+1

是的,这是在编译时评估并用作常量。 – Unknown

回答

1

难道这仍被视为由编译器常量表达式?

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

(只是为了清楚起见。当然文字仍然被认为是常量表达式)

然而,在C中,阵列的大小不必是一个编译时间常数。 C99和C11支持可变长度阵列(VLA),因此

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

也是有效的C.

0

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

如你所知,我们不能做

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

,因为这是没有一个常数。但你写的是一个常数,所以你很好走

+1

我认为第二我们可以用新编译器 –

+2

“我们做不到” - 我们可以,你碰巧住在1999年之前吗? – 2013-07-30 10:36:10

+1

这在C99中有效。 – haccks

1

是的,你可以使用这个表达式。它不会导致UB。
注意,阵列subcript可以是整数表达式

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

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

+0

向下选民留下您的评论... – haccks

2

是的,它会工作.MACRO将被放置在编译的位置,所以a[2*SOMEMACRO]将变成a[2*10]这是完全有效的。

要检查什么是预处理可以使用cc -E foo.c选项