关于define 语句
#define最后加不加分号跟define本身没有关系,而取决于你使用的地方。
如:
#define MY_VALUE 5;
如果这样用:
int x =MY_VALUE; //没有问题,相当于int x=5;; 注意是两个分号罗
但这样用:if(x == MY_VALUE ) //这样用有问题,因为其相当于:if(x==5;)
明白了么?实际#define 只是起替换的作用。
还有个比较经典的例子是。
#define TEST(x) (x)*(x)
那么 int x=5;
int y= TEST(++x); //y的值是多少? 36? 错了,是 (++x)*(++x)=6*7=42
帮我看看这个define语句什么意思
一个概念性问题:#define是预处理命令,不是语句。
作为预处理命令,#define只能在一行内有效。因此需要用续行符\连接不同行。
预处理器进行断行连接后,#define SetDispatchTableEntry(ui32Index, pfFunction) \ _SetDispatchTableEntry(PVRSRV_GET_BRIDGE_ID(ui32Index), #ui32Index, (BridgeWrapperFunction)pfFunction, #pfFunction)变成#define SetDispatchTableEntry(ui32Index, pfFunction) _SetDispatchTableEntry(PVRSRV_GET_BRIDGE_ID(ui32Index), #ui32Index, (BridgeWrapperFunction)pfFunction, #pfFunction)(这里显示可能会有些问题,实际上是同一行。)这样大段代码可以分行写,可读性良好。
在断行连接后,预处理器进行#define定义的宏的替换。带参数的宏替换中有两个特殊的操作符,#和##,前者可以把记号(token)转换成字符串字面量,后者可以连接两个记号。
对于#,接以上的例子:#define SetDispatchTableEntry(ui32Index, pfFunction) _SetDispatchTableEntry(PVRSRV_GET_BRIDGE_ID(ui32Index), #ui32Index, (BridgeWrapperFunction)pfFunction, #pfFunction)对于SetDispatchTableEntry(123, foo),会替换成:_SetDispatchTableEntry(PVRSRV_GET_BRIDGE_ID(123), "foo", (BridgeWrapperFunction)foo, "foo")。注意宏替换不检查语义,如果有类型不匹配之类的编译错误,之后才会提示出来。
对于##,例子如下:#define join(a, b) a##bjoin(x,y)被替换为xy。====[原创回答团]。
在C语言中define是不是关键字
在C语言中define不是关键字。define是编译器的预编译指令,是编译器实现的,不是C语言的内容。
C语言中的关键字及意义如下:
auto 局部变量(自动储存)
break无条件退出程序最内层循环
case switch语句中选择项
char单字节整型数据
const定义不可更改的常量值
continue中断本次循环,并转向下一次循环
default switch语句中的默认选择项
do 用于构成do。..while循环语句
double定义双精度浮点型数据
else构成if。..else选择程序结构
enum枚举
extern在其它程序模块中说明了全局变量
float定义单精度浮点型数据
for构成for循环语句
goto构成goto转移结构
if构成if。.else选择结构
int基本整型数据
long长整型数据
registerCPU内部寄存的变量
return用于返回函数的返回值
short短整型数据
signed有符号数
sizoef计算表达式或数据类型的占用字节数
static定义静态变量
struct定义结构类型数据
switch构成switch选择结构
typedef重新定义数据类型
union联合类型数据
unsigned定义无符号数据
void定义无类型数据
volatile该变量在程序中执行中可被隐含地改变
while用于构成do。while或while循环结构