在阅读一些项目的源代码时,遇到了一些我平时很少见,但发现很有用的C语言语法,在此整理一下。
#undef
我们平时用的都是#define,突然遇到了这个。。。其实,#undef 与 #define 相对应。#undef 的作用是取消已经有的宏定义。
#include<stdio.h>
#define MAX 5
int main()
{
#undef MAX
// printf("%d\n",MAX);
#define MAX 6
printf("%d\n",MAX);
return 0;
}
结果:
当取消第6行printf的注释,将会报错,‘MAX’ undeclared , 因为MAX宏被undef 取消了。
结构体中的可变长数组 char data[0];
常见如下形式的定义:
struct buf
{
int len;
char data[0];
};
这其实是实现了一个变长数组data,data只是一个数组名,初始data没有元素,而且该数组的真实地址紧随结构体struct buf之后。所以,结构体的大小并不包含数组占用的大小(即使数组以后有了元素),但是却仍然可以像使用结构体成员一样操作data。
//将“hello”存入data数组
#include<stdio.h>
struct buf
{
int len;
char data[0];
};
int main()
{
struct buf *p = (struct buf*)malloc(sizeof(struct buf)+5);
strcpy(p->data,"hello");
printf("%d\n%s\n",sizeof(struct buf),p->data);
return 0;
}
#pragma
#pragma message("消息文本")
当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。
#pragma once
(比较常用)
只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在VC6中就已经有了,但是考虑到兼容性并没有太多的使用它。
#pragma once是编译相关,就是说这个编译系统上能用,但在其他编译系统不一定可以,也就是说移植性差,不过现在基本上已经是每个编译器都有这个定义了。
#ifndef,#define,#endif这个是C++语言相关,这是C++语言中的宏定义,通过宏定义避免文件多次编译。所以在所有支持C++语言的编译器上都是有效的,如果写的程序要跨平台,最好使用这种方式
更多参见:百度百科#pragma