我正在寻找一种自动生成头文件的方法。这个文件是库的公共接口,我想在编译之前“填充”一些结构和东西。
例如,在私有标题中,我有一个包含有用字段的结构:
typedef struct mystuff_attr_t {
int _detachstate;
mystuff_scope_t _scope;
cpu_set_t _cpuset;
size_t _stacksize;
void* _stackaddr;
} mystuff_attr_t;
我希望在没有字段但具有相同大小(目前手动完成)的公共标题中使用此结构:
typedef struct mystuff_attr_t {
char _opaque[ 20 ];
} mystuff_attr_t;
我想在创建构建系统时由CMake自动生成这个,以便在我更改私有头中的struct时避免公共接口中的大小结构错误。
答案 0 :(得分:9)
事实上,CMake允许您生成文件(使用configure_file (file.h.in file.h)
)并检查类型大小(使用check_type_size ("type" header.h)
),因此很容易将这两者合并为一个合适的公共标题。这是我在CMakeList.txt中使用的代码:
# Where to search for types :
set (CMAKE_EXTRA_INCLUDE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/private_type.h)
# Type1 :
check_type_size ("type1_t" MY_SIZEOF_TYPE1_T)
# Generate public header :
configure_file (${CMAKE_CURRENT_SOURCE_DIR}/pub_type.h.in ${CMAKE_CURRENT_BINARY_DIR}/pub_type.h)
# Need to set this back to nothing :
set (CMAKE_EXTRA_INCLUDE_FILES)
在公共标题pub_type.h.in中:
#define MY_SIZEOF_TYPE1_T ${MY_SIZEOF_TYPE1_T}
这非常有效:)
答案 1 :(得分:3)
Makeheaders工具(manual)。
答案 2 :(得分:2)
我会写一个创建标题的exe。
例如:
#include <stdio.h>
#define PUBLIC(TYPE) \
printf( "typedef struct %s { char _opaque[ %d ]; } %s;\n", #TYPE, sizeof(TYPE), #TYPE )
int main()
{
// start header stuff
PUBLIC(mystuff_attr_t);
// end header stuff
}