include的另类使用
1.介绍
最近在看Android 8.0 的RIL部分的源代码,在<android_source_root>//hardware/ril/libril/ril.cpp 中看到,如下代码:
/** Index == requestNumber */
static CommandInfo s_commands[] = {
#include "ril_commands.h"
};
static UnsolResponseInfo s_unsolResponses[] = {
#include "ril_unsol_commands.h"
};
觉得很有意思,别与正常的头文件使用,不仅仅是代码简洁了,易于查看,也进一步说明头文件的工作原理。
特在此使用一个简单的例子记录一下。
2.示例
2.1 原始代码
/*************************************************************************
> File Name: main.c
> Author: JayTan
> Mail: jaytanfly@gmail.com
> Created Time: 2018年04月12日 星期四 09时02分46秒
************************************************************************/
#include <stdio.h>
typedef struct CmdInfo {
int i;
char* name;
int (*callback)(int, char* );
}s_CmdInfo;
int say_hello_callback(int i, char* name){
printf("%s: cmd id:%d, name:%s\n", __FUNCTION__, i, name);
return 0;
}
s_CmdInfo cmdInfo[] = {
{0, "helloworld", say_hello_callback},
};
int main(int argc, char** argv){
cmdInfo[0].callback(cmdInfo[0].i, cmdInfo[0].name);
return 0;
}
测试:
gcc main.c -o a
./a
输出:
say_hello_callback: cmd id:0, name:helloworld
代码很简单,就是定义了一个包含id,name,callback函数的结构体数组,然后进行调用。但是如果该数组很大怎么办?其可阅读性就大大下降了,所以就出现了在Android 源码中include 的另一种使用方法。
2.2 使用include之后
main.c 文件:
/*************************************************************************
> File Name: main.c
> Author: JayTan
> Mail: jaytanfly@gmail.com
> Created Time: 2018年04月12日 星期四 09时02分46秒
************************************************************************/
#include <stdio.h>
typedef struct CmdInfo {
int i;
char* name;
int (*callback)(int, char* );
}s_CmdInfo;
#include "head1.h"
s_CmdInfo cmdInfo[] = {
#include "head2.h"
};
int main(int argc, char** argv){
cmdInfo[0].callback(cmdInfo[0].i, cmdInfo[0].name);
return 0;
}
head1.h
/*************************************************************************
> File Name: head1.h
> Author: JayTan
> Mail: jaytanfly@gmail.com
> Created Time: 2018年04月12日 星期四 09时04分22秒
************************************************************************/
int say_hello_callback(int i, char* name){
printf("%s: cmd id:%d, name:%s\n", __FUNCTION__, i, name);
return 0;
}
head2.h
/*************************************************************************
> File Name: head2.h
> Author: JayTan
> Mail: jaytanfly@gmail.com
> Created Time: 2018年04月12日 星期四 09时38分02秒
************************************************************************/
{0, "helloworld", say_hello_callback},
{0, NULL, NULL},
测试:
gcc main.c -o a
./a
输出:say_hello_callback: cmd id:0, name:helloworld
与2.1节的原始代码相比,只是将函数的定义以及cmdInfo数组中的定义搬到了头文件head1.h 和 head2.h中,但是在以后的代码增加的过程中,主函数不会受到太大的影响。保证了代码的简洁性,提高了可阅读性。
3.个人理解
通过上面的例子其实可以很好的理解include的工作原理,就是在预编译阶段将include的文档全部搬过来。所以常规的或者说是通用的头文件都会有相关的宏定义防止重复包含,因为不能在一个文件里定义两次相同的函数,变量或者其他的。 因该例子不是头文件的常规用法,所以也没有像常规头文件一样添加宏定义防止多次引用。
版权声明:本文为博主原创文章,未经博主允许不得转载。原文链接:https://blog.youkuaiyun.com/ta_tan