C语言一些少见但很有用的语法
2016-01-27 23:23
621 查看
在阅读一些项目的源代码时,遇到了一些我平时很少见,但发现很有用的C语言语法,在此整理一下。
结果:
当取消第6行printf的注释,将会报错,‘MAX’ undeclared , 因为MAX宏被undef 取消了。
这其实是实现了一个变长数组data,data只是一个数组名,初始data没有元素,而且该数组的真实地址紧随结构体struct buf之后。所以,结构体的大小并不包含数组占用的大小(即使数组以后有了元素),但是却仍然可以像使用结构体成员一样操作data。
当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。
(比较常用)
只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在VC6中就已经有了,但是考虑到兼容性并没有太多的使用它。
#pragma once是编译相关,就是说这个编译系统上能用,但在其他编译系统不一定可以,也就是说移植性差,不过现在基本上已经是每个编译器都有这个定义了。
#ifndef,#define,#endif这个是C++语言相关,这是C++语言中的宏定义,通过宏定义避免文件多次编译。所以在所有支持C++语言的编译器上都是有效的,如果写的程序要跨平台,最好使用这种方式
更多参见:百度百科#pragma
#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
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- Lua和C语言的交互详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中计算正弦的相关函数总结
- 使用C语言详解霍夫曼树数据结构
- 探讨C语言的那些小秘密之断言
- C语言实现BMP转换JPG的方法
- 深入探讨C语言中局部变量与全局变量在内存中的存放位置
- C语言查找数组里数字重复次数的方法