从.h头文件中删除预编译器指令

时间:2016-10-25 14:29:12

标签: c conditional-compilation precompile precompiled-headers

我遇到了一个我不知道如何解决的问题。

将以下typedef结构假设为test.h头文件:

typedef struct example_struct {
    #ifdef CONFIG_A
    int A;
    #endif;

    int B;
} example_struct_t;

我正在使用此头文件编译代码,使用-D选项将CONFIG_A传递给GCC。这样我就可以在结构中包含一个成员,或者如果给定的用例不需要则删除。

现在假设我生成了一个共享库(.so),我想分发它。所以,我有.so库和带有预编译器指令的头文件。问题是我不想在程序中使用库包含-DCONFIG_A,我的意思是,我需要保存库编译时使用的选项,不仅在源文件(.c)中,而且在头。也就是说,如果用-DCONFIG_A选项编译库,我想使用库的程序不应该在编译时包含该选项。

预编译头是否是此问题的解决方案或是否有其他替代方法(避免在定义预编译器指令的每个文件中包含config.h头)?

非常感谢您的指导。

1 个答案:

答案 0 :(得分:0)

您可以“生成”结构定义的代码,并将生成的定义与相应的库一起发送。一个想法是将结构保留在没有#include的标头中,在这种情况下,您可以在它们上运行C预处理器以获取没有#ifdef的文件(然后您可以使用它来构建和船)。

另一种方法是在构建系统中执行一些特殊操作。例如CMake#cmakedefine,您可以在C或C ++源文件中使用它,然后从中生成代码。