ctime.c@H_301_1@文件,将所有定义的宏,连接成一个字符串数组,可以通过字符串,查询是否该宏生效。
功能
@H_301_1@该文件提供了几个函数,其实只有两个,用于访问有哪些宏被编译进sqlite@H_301_1@中。
@H_301_1@静态的常量字符串azCompileOpt@H_301_1@,保存了编译期间使用的宏,当然不包括sqlITE_CORE@H_301_1@,并且由于是静态的变量,我们只能够通过如下的两个函数访问,并且没有提供当前有多少个宏定义的函数。
函数以及说明
int sqlite3_compileoption_used(const char*zOptName)
@H_301_1@该函数判断传递进来的宏字符串,是否被编译进sqlite@H_301_1@,如果是返回1@H_301_1@,如果不是返回0
const char *sqlite3_compileoption_get(intN)
@H_301_1@返回常量字符串数组第N@H_301_1@个字符串,如果N@H_301_1@超出常量字符串的范围,返回0@H_301_1@,否则返回对应的字符串。
如何关闭
@H_301_1@定义sqlITE_OMIT_COMPILEOPTION_DIAGS@H_301_1@宏,就无法使用上面的函数
@H_301_1@优点:节省了存储宏字符串常量的空间,一般情况下,没有哪种应用需要使用到该字符串常量,但是你不会想到的是,实际上除了一个默认指定的THREAD_SAFE@H_301_1@宏,系统自带的宏几乎是没有的,所以如果你没有指定任何的宏,也就只有一个宏会编译进sqlite@H_301_1@中,当然由于在编译的过程中,需要添加一些模块,或者屏蔽调用FTS1@H_301_1@或者FTS2@H_301_1@这些带有设计缺陷的全文搜索模块,不得不使用了sqlITE_CORE@H_301_1@宏,所以别看sqlite@H_301_1@提供了100@H_301_1@多个宏定义,但看azCompileOpt这个常量的定义就有400行,实际上,不会占用多少空间
添加获取编译宏个数的函数
@H_301_1@假如我想访问现在到底有多少个宏编译进sqlite@H_301_1@数据库中,或者我想输出所有的宏,很明显,我们只能够猜测大概有100@H_301_1@个吧,然后,调用sqlite3_compileoption_get@H_301_1@函数,判断返回值是否为空,不为空,打印看看!!
@H_301_1@当然,目前还没有任何的证据表明,有这个必要。但这只是尝试练习。
for(int i = 0 ; i < 100 ; i++)
{
const char* p = sqlite3_compileoption_get(i);
if (p)
{
cout<<p<<endl;
}
}
方案一:企图访问azCompileOpt字符串
在ctime.c文件中,取消azCompileOpt字符串数组的静态属性,然后想通过在main.cpp文件中,通过extern关键字声明azCompileOpt,来达到使用的目的,结果是失败了!!
出现错误的问题报告如下:
'const char *const []': illegal sizeof operand
@H_301_1@
方案二:添加访问编译宏个数的函数
intsqlite3_compileoption_get_count()
{
returnArraySize(azCompileOpt);
}
这里如果要让外部访问,就必须将该函数声明在sqlite3.h文件当中,我们可以在sqlite3.h文件中搜索上面两个函数是在什么地方声明的,自然就可以在下面追加即可
#ifndef sqlITE_OMIT_COMPILEOPTION_DIAGS
sqlITE_API int sqlITE_STDCALLsqlite3_compileoption_used(const char *zOptName);
sqlITE_API const char *sqlITE_STDCALLsqlite3_compileoption_get(int N);
sqlITE_API intsqlITE_STDCALL sqlite3_compileoption_get_count();
#endif