C语言一些少见但很有用的语法

在阅读一些项目的源代码时,遇到了一些我平时很少见,但发现很有用的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

猜你喜欢

转载自blog.csdn.net/lyh__521/article/details/50597266