发明内容
本发明目的在于,提供一种头文件的处理方法、装置、设备及介质,以提高判断第二计算平台是否支持第一计算平台的接口功能或第一计算平台的第二版本是否支持第一计算平台的第一版本的接口功能的准确性。
根据本发明的第一方面,提供了一种头文件的处理方法,所述处理方法包括以下步骤:
获取第一头文件,使用第一编译器对所述第一头文件进行编译,得到第一编译文件。
获取第一编译的AST文件和宏文件,将第一编译文件的AST文件和宏文件进行合并,得到第一合并文件,第一合并文件包括若干个第一记录,每一第一记录用于记录一个数据结构或接口函数或宏的第一预设信息,第一预设信息包括第一记录对应的数据结构或接口函数或宏的名称。
获取第二合并文件,第二合并文件通过将第二编译文件的AST文件和宏文件合并得到,第二编译文件通过第二编译器对第二头文件编译得到;第二头文件与第一头文件属于不同的计算平台或者属于同一计算平台的不同版本,第二头文件和第一头文件的名称相同。
根据第二合并文件与第一合并文件判断第二头文件是否支持第一头文件对应的接口功能。
进一步的,所述第二合并文件包括若干个第二记录,每一第二记录用于记录一个数据结构或接口函数或宏的第二预设信息,所述第二预设信息包括第二记录对应的数据结构或接口函数或宏的名称。
进一步的,根据第二合并文件与第一合并文件判断第二头文件是否支持第一头文件对应的接口功能包括以下步骤:
获取第一名称列表,所述第一名称列表包括所述第一合并文件中的任一第一记录中的名称。
获取第二名称列表,所述第二名称列表包括所述第二合并文件中的任一第二记录中的名称。
遍历所述第一名称列表,如果所述第一名称列表中任一第一记录中的名称均在所述第二名称列表中存在,则判定第二头文件支持第一头文件对应的接口功能。
进一步的,所述第一合并文件和第二合并文件为json格式。
进一步的,第一编译文件的AST文件通过使用clang对所述第一编译文件进行提取得到。
进一步的,第一编译文件的宏文件通过使用宏提取模块对所述第一编译文件进行提取得到。
根据本发明的第二方面,提供了一种头文件的处理装置,所述处理装置包括:
第一获取模块,用于获取第一头文件,使用第一编译器对所述第一头文件进行编译,得到第一编译文件。
第二获取模块,用于获取第一编译的AST文件和宏文件,将第一编译文件的AST文件和宏文件进行合并,得到第一合并文件,第一合并文件包括若干个第一记录,每一第一记录用于记录一个数据结构或接口函数或宏的第一预设信息,第一预设信息包括第一记录对应的数据结构或接口函数或宏的名称。
第三获取模块,用于获取第二合并文件,第二合并文件通过将第二编译文件的AST文件和宏文件合并得到,第二编译文件通过第二编译器对第二头文件编译得到;第二头文件与第一头文件属于不同的计算平台或者属于同一计算平台的不同版本,第二头文件和第一头文件的名称相同。
第一判断模块,用于根据第二合并文件与第一合并文件判断第二头文件是否支持第一头文件对应的接口功能。
进一步的,所述第二合并文件包括若干个第二记录,每一第二记录用于记录一个数据结构或接口函数或宏的第二预设信息,所述第二预设信息包括第二记录对应的数据结构或接口函数或宏的名称。
进一步的,所述第一判断模块包括:
第四获取模块,用于获取第一名称列表,所述第一名称列表包括所述第一合并文件中的任一第一记录中的名称。
第五获取模块,用于获取第二名称列表,所述第二名称列表包括所述第二合并文件中的任一第二记录中的名称。
第一判定模块,用于遍历所述第一名称列表,如果所述第一名称列表中任一第一记录中的名称均在所述第二名称列表中存在,则判定第二头文件支持第一头文件对应的接口功能。
进一步的,所述第一合并文件和第二合并文件为json格式。
进一步的,第一编译文件的AST文件通过使用clang对所述第一编译文件进行提取得到。
进一步的,第一编译文件的宏文件通过使用宏提取模块对所述第一编译文件进行提取得到。
根据本发明的第三方面,提供了一种电子设备,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现上述的头文件的处理方法。
根据本发明的第四方面,提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现上述的头文件的处理方法。
本发明与现有技术相比至少具有以下有益效果:
本发明对于属于不同计算平台或同一计算平台的不同版本的第一头文件和第二头文件,分别使用对应的编译器对其进行编译,得到了对应的第一编译文件和第二编译文件;基于得到的编译文件,获取了对应的AST文件和宏文件,通过将对应的AST文件和宏文件进行合并,得到了第一合并文件和第二合并文件;本发明中第一头文件和第二头文件的名称相同,只是两者属于不同的计算平台或者同一计算平台的不同版本,本发明并不是直接比对第一头文件和第二头文件,而是先将第一头文件转换为第一合并文件以及先将第二头文件转换为第二合并文件,然后再根据第一合并文件和第二合并文件判断第二头文件是否支持第一头文件对应的接口功能;本发明避免了直接对头文件进行比较的过程,不再存在由于直接比较头文件所导致的比较过程复杂和容易出错的问题,进而提高了判断第二计算平台是否支持第一计算平台的接口功能或第一计算平台的第二版本是否支持第一计算平台的第一版本的接口功能的准确性;而且,本发明通过对第二头文件进行编译的方式还能够判断第二头文件中数据结构或接口函数或宏的功能是否在软件中真正实现了,进一步提高了判断第二计算平台是否支持第一计算平台的接口功能或第一计算平台的第二版本是否支持第一计算平台的第一版本的接口功能的准确性。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
实施例一
如图1所示,本实施例提供了一种头文件的处理方法,所述处理方法包括以下步骤:
S100,获取第一头文件,使用第一编译器对所述第一头文件进行编译,得到第一编译文件。
S200,获取第一编译的AST文件和宏文件,将第一编译文件的AST文件和宏文件进行合并,得到第一合并文件,第一合并文件包括若干个第一记录,每一第一记录用于记录一个数据结构或接口函数或宏的第一预设信息,第一预设信息包括第一记录对应的数据结构或接口函数或宏的名称。
可选的,第一合并文件为json格式。本领域技术人员知悉,json(JavaScriptObject Notation,JS对象简谱)是一种轻量级的数据交换格式,是一种现有的格式,此处不再赘述。
具体的,第一编译文件的AST(Abstract Syntax Trees,抽象语法树)文件通过使用clang对所述第一编译文件进行提取得到。本领域技术人员知悉,clang是一个轻量级编译器,使用clang获取AST文件的过程为现有技术,此处不再赘述。
具体的,第一编译文件的宏文件通过使用宏提取模块对所述第一编译文件进行提取得到。本领域技术人员知悉,现有技术中任何的宏文件提取模块均落入本发明的保护范围,可选的,宏文件提取模块为正则表达式函数。
作为一个具体实施方式,第一记录信息包括属性(kind)、名称(name)、类型(qualType)、定义的文件presumedFile和定义的行presumedLine。其中,kind用于表征第一记录对应的是数据结构或接口函数或宏,name用于表示第一记录对应的是数据结构或接口函数或宏的名称,qualType用于表征第一记录对应的是数据结构或接口函数或宏的类型,presumedFile用于表征第一记录对应的是数据结构或接口函数或宏所属的文件名,presumedLine用于表征的第一记录对应的是数据结构或接口函数或宏的位置信息。
S300,获取第二合并文件,第二合并文件通过将第二编译文件的AST文件和宏文件合并得到,第二编译文件通过第二编译器对第二头文件编译得到;第二头文件与第一头文件属于不同的计算平台或者属于同一计算平台的不同版本,第二头文件和第一头文件的名称相同。
本实施例中,第二头文件和第二编译器属于同一计算平台的同一版本,第一头文件和第一编译器属于同一计算平台的同一版本。
具体的,第二合并文件包括若干个第二记录,每一第二记录用于记录一个数据结构或接口函数或宏的第二预设信息,所述第二预设信息包括第二记录对应的数据结构或接口函数或宏的名称。
本实施例中,如果第二头文件支持第一头文件对应的全部接口功能,那么第二合并文件中第二记录的数量大于等于第一合并文件中第一记录的数量,其中,当第二合并文件中第二记录的数量大于第一合并文件中第一记录的数量时,说明第二头文件除支持第一头文件对应的全部接口功能以外,还新增了接口功能;当第二合并文件中第二记录的数量等于第一合并文件中第一记录的数量时,说明第二头文件支持第一头文件对应的全部接口功能且没有新增接口功能。
本实施例中第二合并文件和第一合并文件的格式相同,可选的,第二合并文件和第一合并文件均为json格式。
S400,根据第二合并文件与第一合并文件判断第二头文件是否支持第一头文件对应的接口功能。
具体的,如图2所示,S400包括:
S410,获取第一名称列表,所述第一名称列表包括所述第一合并文件中的任一第一记录中的名称。
具体的,第一名称列表为A,A=(a1,a2,…,am,…,aM),am为所述第一合并文件的第m个第一记录中的名称,m的取值范围为1到M,M为所述第一合并文件中第一记录的数量。
S420,获取第二名称列表,所述第二名称列表包括所述第二合并文件中的任一第二记录中的名称。
具体的,第二名称列表为B,A=(b1,b2,…,bn,…,bN),bn为所述第二合并文件的第n个第二记录中的名称,n的取值范围为1到N,N为所述第二合并文件中的第二记录的数量。
S430,遍历所述第一名称列表,如果所述第一名称列表中任一第一记录中的名称均在所述第二名称列表中存在,则判定第二头文件支持第一头文件对应的接口功能。
本实施例中将两个头文件的比较过程最终转化为名字之间的比较过程,简化了比较的复杂性,使得到的比较结果不容易出错,更为准确。
具体的,遍历A,如果B中存在bn与am相等,则判定第二头文件支持am对应的接口功能,否则,判定第二头文件不支持am对应的接口功能。本实施例中,当A中任一am均在B中存在时,才判定第二头文件支持第一头文件对应的接口功能。如果A中某些am不在B中存在时,优选的,输出在B中存在的am的数量以及包含这些不在B中存在的am的信息,以便于用户知晓第二头文件不支持第一头文件对应的哪些接口功能。
本实施例中第一名称列表是第一合并文件中所有第一记录中的名称的列表,第二名称列表是第二合并文件中所有第二记录中的名称的列表,本实施例将第一名称列表中任一第一记录中的名称在第二名称列表中进行查找的方法相当于是将第二合并文件中数据结构、接口函数和宏的名称合并在一起,不再区分每一名称是属于数据结构的名称、接口函数的名称还是宏的名称,相较于将第一合并文件中数据结构对应的名称与第二合并文件中数据结构对应的名称相比、将第一合并文件中接口函数对应的名称与第二合并文件中接口函数对应的名称相比和将第一合并文件中宏对应的名称与第二合并文件中宏对应的名称相比,本实施能够避免第一头文件和第二头文件中相同接口功能对应的类型不一致的情况,比如第一头文件中实现某一接口功能的是接口函数,而在第二头文件中实现相同接口功能的是宏,进而提高了判断第二头文件是否支持第一头文件对应的接口功能的准确性。
本实施例中,第一头文件所属的计算机平台或版本的压缩包的头文件的数量并不唯一,对于第一头文件所属的计算机平台的压缩包的任一头文件,均执行上述步骤S100-S400;本实施例中,只有判定第一头文件所属的计算机平台的压缩包的任一头文件均被对应的第二头文件支持时,才判定第二头文件所属的计算机平台或版本支持第一头文件所属的计算机平台或版本。
本实施例对于属于不同计算平台或同一计算平台的不同版本的第一头文件和第二头文件,分别使用对应的编译器对其进行编译,得到了对应的第一编译文件和第二编译文件;基于得到的编译文件,获取了对应的AST文件和宏文件,通过将对应的AST文件和宏文件进行合并,得到了第一合并文件和第二合并文件;本发明中第一头文件和第二头文件的名称相同,只是两者属于不同的计算平台或者同一计算平台的不同版本,本实施例并不是直接比对第一头文件和第二头文件,而是先将第一头文件转换为第一合并文件以及先将第二头文件转换为第二合并文件,然后再根据第一合并文件和第二合并文件判断第二头文件是否支持第一头文件对应的接口功能;本实施例避免了直接对头文件进行比较的过程,不再存在由于直接比较头文件所导致的比较过程复杂和容易出错的问题,进而提高了判断第二计算平台是否支持第一计算平台的接口功能或第一计算平台的第二版本是否支持第一计算平台的第一版本的接口功能的准确性;而且,本实施例通过对第二头文件进行编译的方式还能够判断第二头文件中数据结构或接口函数或宏的功能是否在软件中真正实现了,进一步提高了判断第二计算平台是否支持第一计算平台的接口功能或第一计算平台的第二版本是否支持第一计算平台的第一版本的接口功能的准确性。
实施例二
如图3所示,本实施例提供了一种头文件的处理装置,所述处理装置包括:
第一获取模块100,用于获取第一头文件,使用第一编译器对所述第一头文件进行编译,得到第一编译文件。
第二获取模块200,用于获取第一编译的AST文件和宏文件,将第一编译文件的AST文件和宏文件进行合并,得到第一合并文件,第一合并文件包括若干个第一记录,每一第一记录用于记录一个数据结构或接口函数或宏的第一预设信息,第一预设信息包括第一记录对应的数据结构或接口函数或宏的名称。
可选的,第一合并文件为json格式。本领域技术人员知悉,json(JavaScriptObject Notation,JS对象简谱)是一种轻量级的数据交换格式,是一种现有的格式,此处不再赘述。
具体的,第一编译文件的AST(Abstract Syntax Trees,抽象语法树)文件通过使用clang对所述第一编译文件进行提取得到。本领域技术人员知悉,clang是一个轻量级编译器,使用clang获取AST文件的过程为现有技术,此处不再赘述。
具体的,第一编译文件的宏文件通过使用宏提取模块对所述第一编译文件进行提取得到。本领域技术人员知悉,现有技术中任何的宏文件提取模块均落入本发明的保护范围,可选的,宏文件提取模块为正则表达式函数。
作为一个具体实施方式,第一记录信息包括属性(kind)、名称(name)、类型(qualType)、定义的文件presumedFile和定义的行presumedLine。其中,kind用于表征第一记录对应的是数据结构或接口函数或宏,name用于表示第一记录对应的是数据结构或接口函数或宏的名称,qualType用于表征第一记录对应的是数据结构或接口函数或宏的类型,presumedFile用于表征第一记录对应的是数据结构或接口函数或宏所属的文件名,presumedLine用于表征的第一记录对应的是数据结构或接口函数或宏的位置信息。
第三获取模块300,用于获取第二合并文件,第二合并文件通过将第二编译文件的AST文件和宏文件合并得到,第二编译文件通过第二编译器对第二头文件编译得到;第二头文件与第一头文件属于不同的计算平台或者属于同一计算平台的不同版本,第二头文件和第一头文件的名称相同。
本实施例中,第二头文件和第二编译器属于同一计算平台的同一版本,第一头文件和第一编译器属于同一计算平台的同一版本。
具体的,第二合并文件包括若干个第二记录,每一第二记录用于记录一个数据结构或接口函数或宏的第二预设信息,所述第二预设信息包括第二记录对应的数据结构或接口函数或宏的名称。
本实施例中,如果第二头文件支持第一头文件对应的全部接口功能,那么第二合并文件中第二记录的数量大于等于第一合并文件中第一记录的数量,其中,当第二合并文件中第二记录的数量大于第一合并文件中第一记录的数量时,说明第二头文件除支持第一头文件对应的全部接口功能以外,还新增了接口功能;当第二合并文件中第二记录的数量等于第一合并文件中第一记录的数量时,说明第二头文件支持第一头文件对应的全部接口功能且没有新增接口功能。
本实施例中第二合并文件和第一合并文件的格式相同,可选的,第二合并文件和第一合并文件均为json格式。
第一判断模块400,用于根据第二合并文件与第一合并文件判断第二头文件是否支持第一头文件对应的接口功能。
具体的,如图4所示,第一判断模块400包括:
第四获取模块410,用于获取第一名称列表,所述第一名称列表包括所述第一合并文件中的任一第一记录中的名称。
具体的,第一名称列表为A,A=(a1,a2,…,am,…,aM),am为所述第一合并文件的第m个第一记录中的名称,m的取值范围为1到M,M为所述第一合并文件中第一记录的数量。
第五获取模块420,用于获取第二名称列表,所述第二名称列表包括所述第二合并文件中的任一第二记录中的名称。
具体的,第二名称列表为B,A=(b1,b2,…,bn,…,bN),bn为所述第二合并文件的第n个第二记录中的名称,n的取值范围为1到N,N为所述第二合并文件中的第二记录的数量。
第一判定模块430,用于遍历所述第一名称列表,如果所述第一名称列表中任一第一记录中的名称均在所述第二名称列表中存在,则判定第二头文件支持第一头文件对应的接口功能。
本实施例中将两个头文件的比较过程最终转化为名字之间的比较过程,简化了比较的复杂性,使得到的比较结果不容易出错,更为准确。
具体的,遍历A,如果B中存在bn与am相等,则判定第二头文件支持am对应的接口功能,否则,判定第二头文件不支持am对应的接口功能。本实施例中,当A中任一am均在B中存在时,才判定第二头文件支持第一头文件对应的接口功能。如果A中某些am不在B中存在时,优选的,输出在B中存在的am的数量以及包含这些不在B中存在的am的信息,以便于用户知晓第二头文件不支持第一头文件对应的哪些接口功能。
本实施例中第一名称列表是第一合并文件中所有第一记录中的名称的列表,第二名称列表是第二合并文件中所有第二记录中的名称的列表,本实施例将第一名称列表中任一第一记录中的名称在第二名称列表中进行查找的方法相当于是将第二合并文件中数据结构、接口函数和宏的名称合并在一起,不再区分每一名称是属于数据结构的名称、接口函数的名称还是宏的名称,相较于将第一合并文件中数据结构对应的名称与第二合并文件中数据结构对应的名称相比、将第一合并文件中接口函数对应的名称与第二合并文件中接口函数对应的名称相比和将第一合并文件中宏对应的名称与第二合并文件中宏对应的名称相比,本实施能够避免第一头文件和第二头文件中相同接口功能对应的类型不一致的情况,比如第一头文件中实现某一接口功能的是接口函数,而在第二头文件中实现相同接口功能的是宏,进而提高了判断第二头文件是否支持第一头文件对应的接口功能的准确性。
本实施例中,第一头文件所属的计算机平台或版本的压缩包的头文件的数量并不唯一,对于第一头文件所属的计算机平台的压缩包的任一头文件,均执行上述步骤S100-S400;本实施例中,只有判定第一头文件所属的计算机平台的压缩包的任一头文件均被对应的第二头文件支持时,才判定第二头文件所属的计算机平台或版本支持第一头文件所属的计算机平台或版本。
本实施例对于属于不同计算平台或同一计算平台的不同版本的第一头文件和第二头文件,分别使用对应的编译器对其进行编译,得到了对应的第一编译文件和第二编译文件;基于得到的编译文件,获取了对应的AST文件和宏文件,通过将对应的AST文件和宏文件进行合并,得到了第一合并文件和第二合并文件;本发明中第一头文件和第二头文件的名称相同,只是两者属于不同的计算平台或者同一计算平台的不同版本,本实施例并不是直接比对第一头文件和第二头文件,而是先将第一头文件转换为第一合并文件以及先将第二头文件转换为第二合并文件,然后再根据第一合并文件和第二合并文件判断第二头文件是否支持第一头文件对应的接口功能;本实施例避免了直接对头文件进行比较的过程,不再存在由于直接比较头文件所导致的比较过程复杂和容易出错的问题,进而提高了判断第二计算平台是否支持第一计算平台的接口功能或第一计算平台的第二版本是否支持第一计算平台的第一版本的接口功能的准确性;而且,本实施例通过对第二头文件进行编译的方式还能够判断第二头文件中数据结构或接口函数或宏的功能是否在软件中真正实现了,进一步提高了判断第二计算平台是否支持第一计算平台的接口功能或第一计算平台的第二版本是否支持第一计算平台的第一版本的接口功能的准确性。
实施例三
本实施例提供了一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,处理器执行计算机程序时实现以下步骤:
获取第一头文件,使用第一编译器对所述第一头文件进行编译,得到第一编译文件。
获取第一编译的AST文件和宏文件,将第一编译文件的AST文件和宏文件进行合并,得到第一合并文件,第一合并文件包括若干个第一记录,每一第一记录用于记录一个数据结构或接口函数或宏的第一预设信息,第一预设信息包括第一记录对应的数据结构或接口函数或宏的名称。
获取第二合并文件,第二合并文件通过将第二编译文件的AST文件和宏文件合并得到,第二编译文件通过第二编译器对第二头文件编译得到;第二头文件与第一头文件属于不同的计算平台或者属于同一计算平台的不同版本,第二头文件和第一头文件的名称相同。
根据第二合并文件与第一合并文件判断第二头文件是否支持第一头文件对应的接口功能。
实施例四
本实施例提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现以下步骤:
获取第一头文件,使用第一编译器对所述第一头文件进行编译,得到第一编译文件。
获取第一编译的AST文件和宏文件,将第一编译文件的AST文件和宏文件进行合并,得到第一合并文件,第一合并文件包括若干个第一记录,每一第一记录用于记录一个数据结构或接口函数或宏的第一预设信息,第一预设信息包括第一记录对应的数据结构或接口函数或宏的名称。
获取第二合并文件,第二合并文件通过将第二编译文件的AST文件和宏文件合并得到,第二编译文件通过第二编译器对第二头文件编译得到;第二头文件与第一头文件属于不同的计算平台或者属于同一计算平台的不同版本,第二头文件和第一头文件的名称相同。
根据第二合并文件与第一合并文件判断第二头文件是否支持第一头文件对应的接口功能。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)或闪存。易失性存储器可包括随机存取存储器(RAM)或者外部高速缓冲存储器。作为说明而非局限,RAM以多种形式可得,诸如静态RAM(SRAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、双数据率SDRAM(DDRSDRAM)、增强型SDRAM(ESDRAM)、同步链路(Synchlink) DRAM(SLDRAM)、存储器总线(Rambus)直接RAM(RDRAM)、直接存储器总线动态RAM(DRDRAM)、以及存储器总线动态RAM(RDRAM)等。
所属领域的技术人员可以清楚地了解到,为了描述的方便和简洁,仅以上述各功能单元、模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能单元、模块完成,即将所述装置的内部结构划分成不同的功能单元或模块,以完成以上描述的全部或者部分功能。
虽然已经通过示例对本发明的一些特定实施例进行了详细说明,但是本领域的技术人员应该理解,以上示例仅是为了进行说明,而不是为了限制本发明的范围。本领域的技术人员还应理解,可以对实施例进行多种修改而不脱离本发明的范围和精神。本发明的范围由所附权利要求来限定。