gol*_*ean 3 c macros c-preprocessor
可能重复:
一个谜语(在C中)
关于以下代码段,我有几个问题:
#include<stdio.h>
#define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
int array[] = {23,34,12,17,204,99,16};
int main()
{
int d;
for(d=-1;d <= (TOTAL_ELEMENTS-2);d++)
printf("%d\n",array[d+1]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这里代码的输出不会按预期打印数组元素.但是当我添加一个(int)的类型转换时,ELEMENTS的宏定义为
#define TOTAL_ELEMENTS (int) (sizeof(array) / sizeof(array[0]))
Run Code Online (Sandbox Code Playgroud)
它按预期显示所有数组元素.
基于此,我有几个问题:
如果我有一些宏定义,这是否意味着:
#define AA (-64)
默认情况下,在C中,所有定义为宏的常量都等同于signed int.
如果是,那么
但是,如果我必须强制在宏中定义一些常量,因为unsigned int是否有任何常量后缀而不是我可以使用(我试过UL,UD既不起作用)?
如何在宏定义中定义常量以表现为unsigned int?
Mir*_*toš 12
看看这一行:
for(d=-1;d <= (TOTAL_ELEMENTS-2);d++)
Run Code Online (Sandbox Code Playgroud)
在第一次迭代中,您正在检查是否
-1 <= (TOTAL_ELEMENTS-2)
Run Code Online (Sandbox Code Playgroud)
运算符size_of返回无符号值,检查失败(在32位机器上签名为-1 signed = 0xFFFFFFFF).
循环中的一个简单更改可以解决问题:
for(d=0;d <= (TOTAL_ELEMENTS-1);d++)
printf("%d\n",array[d]);
Run Code Online (Sandbox Code Playgroud)
回答你的其他问题:C宏是按文本扩展的,没有类型的概念.C编译器将您的循环视为:
for(d=-1;d <= ((sizeof(array) / sizeof(array[0]))-2);d++)
Run Code Online (Sandbox Code Playgroud)
如果要在宏中定义无符号常量,请使用通常的后缀(ufor unsigned,ulfor unsigned long).