struct linked_list{ struct linked_list* next; int x; /*other elements here perhaps */ } struct linked_list* head;
还有一种不完全类型就是将一个结构的最后一项定义为一个空的数组,这样可以用来表示一个可变长度的结构或数组,演示该技术的代码如下:
1 #include <stdlib.h> 2 #include <stdio.h> 3 4 typedef struct { 5 int length; 6 int arr[0]; 7 } incomplete_type; 8 9 int main(){ 10 char hello[] = "Hello, world!"; 11 int length = sizeof(hello) / sizeof(char); 12 incomplete_type* p = (incomplete_type*)malloc(sizeof(int) + length*sizeof(char)); 13 p->length = length; 14 for(int i=0; i<p->length; i++){ 15 p->arr[i] = hello[i]; 16 } 17 printf("p->length=%d\n", p->length); 18 printf("p->arr=%s\n", p->arr); 19 }
打造C/C++的IDE
后面的内容展示如何将Vim打造成一个半自动的C/C++ IDE。读过我的Java博客的朋友应该知道,其实我更喜欢用Eclipse。只有在需要写非常简单的程序(比如做习题)的情况下,我才会用Vim。这在我的《打造属于自己的Vim》中有论述。在这篇文章中我展示了怎么使用Vundle管理插件以及怎么怎么阅读帮助文档,同时展示了taglist.vim的简单用法。如果要用Vim来写C/C++程序,还需要做少许扩展。
第一,安装以下几个插件,由于使用Vundle管理插件,所以只需要把插件名写入.vimrc配置文件,然后运行:BundleInstall即可,如下图:
分别介绍一下这几个插件。The-NERD-tree是一个浏览目录和文件的插件,可以使用:help NERD_tree.txt查看它的帮助文档。taglist.vim是浏览符号以及在符号之间跳转的插件,使用:help taglist.txt查看它的帮助文档。a.vim是在源代码文件和头文件之间跳转的插件,不需要帮助文档,它的命令就是:A。c.vim是提供IDE功能的主要插件,它提供的功能有自动注释、反注释、自动插入代码块及自动运行,如果安装了splint,还可以对代码进行静态检查,使用:help csupport.txt查看它的文档。OmniCppComplete是一个提供自动补全功能的插件,使用:help omnicppcomplete.txt查看它的文档。
这些插件中,taglist.vim和OmniCppComplete需要ctags软件的支持,所以需要安装exuberant-ctags软件包,在Fedora 20中,只需要使用yum install ctags即可自动安装。
第二,生成tags数据库,并将其加入到Vim中。
我们写C程序的时候,使用到的文件主要存在于两个地方,一个是我们工作的当前目录,另外一个是/usr/include。所以要到/usr/include目录下使用ctags命令生成tags数据库文件。为了使tags数据库中包含尽可能多的信息(结构、枚举、类、函数、宏定义等等),需要指定ctags的参数,如下:
然后将该tags文件的路径加入到.vimrc配置文件中,同时设置一个键盘映射,使得按Ctrl+F12时,在工作目录中调用ctags命令。如下配置文件的最后两行:
然后,在使用Vim写C程序的时候,如果输入了.、->这样的元素,则其成员会自动补全。如果输入的是一个字符串(比如函数名),可以按Ctrl-X Ctrl-O调用自动补全,如下图: