关于 C99, VLA, alloca的笔记

转自:

http://blog.163.com/163_zhujingwei/blog/static/973305972011519114611170/

 

近日在胡乱写代码的时候发现,如下代码竟然能在gcc下编译通过

#include <stdlib.h>
#include <stdio.h>
int main(int argc, char **argv) {
    int n = atoi(argv[1]);
    int arr[n];
    fprintf(stdout, "array length : %d\n", sizeof(arr) / sizeof(int));
    return 0;
}

而且连warning都不会报。 对此几乎是完全颠覆我对数组理解的做法深感差异,于是在vs上试了一下。
果然入我所料连最新版本的vs2010都不支持这样的写法,直接报error。

后来经过学习得知,VLA(Variable Length Array)是C99标准新增的特性之一。原来在ANSI C里面
有一个叫alloca的函数,无责任估计vla用的就是alloca的实现,只是C99从语言标准的层面加强了对
变长数组(不是vector那种)的支持。这种语法几乎在一定程度上抢了new/delete, malloc/free的饭碗,
但其优缺点亦非常明显。
优点:1/使用简单,代码紧凑,还不用free/delete,不会造成memory leak
     2/在栈上申请空间,比malloc/new在堆上申请空间更加高效
缺点:1/最重要的一点,移植性太差,C99目前受到的质疑很多,短时间内ANSI C还将是主流。
     2/在栈上申请空间,所以切记,这个数组不能太大,不然就异常了。

附带C99若干特性:
1/不定参数的宏定义
#define TRACE(...)    (void)printf(__VA_ARGS__)
个人喜欢用这个来方便的自定义一些日志输出,比如
#define nvfprintf(a,format,...) fprintf(a, "[Native] %s, [File]%s, "format"\n", getCurrentTime().c_str(), __FILE__, ##__VA_ARGS__); fflush(a)

2/将C++中著名的inline作为关键字纳入

3/定义数组
int a[100] = {[0]=1, [2]=3, [89]=98}

4/struct初始化
typedef struct st {
    int a, b, c;
} st_t;
st_t hello = {.a=10, .b=20};
其实后两个已经很变态了,感觉还是尽量少用,太新奇的东西,老男人抗不住的。

你可能感兴趣的:(关于 C99, VLA, alloca的笔记)