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

C 从.h头文件中删除预编译器指令,c,conditional-compilation,precompile,precompiled-headers,C,Conditional Compilation,Precompile,Precompiled Headers,我正面临一个我不知道如何解决的问题 假设将以下typedef结构放入test.h头文件: typedef struct example_struct { #ifdef CONFIG_A int A; #endif; int B; } example_struct_t; 我正在使用这个头文件编译代码,将CONFIG_A通过-D选项传递给GCC。这样,如果给定用例不需要,我就可以将成员包括到结构中或删除 现在假设我生成了一个共享库(.so),并希望分发它。所以,我

我正面临一个我不知道如何解决的问题

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

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

    int B;
} example_struct_t;
我正在使用这个头文件编译代码,将CONFIG_A通过-D选项传递给GCC。这样,如果给定用例不需要,我就可以将成员包括到结构中或删除

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

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

非常感谢您的指导。

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

另一种方法是在构建系统中执行一些特殊的操作。例如,<代码> CMake <代码>有<代码> >“CMACK定义< /代码>”,您可以在C或C++源文件中使用,然后从中生成代码。

< P>您可以“生成”结构定义的代码,并将生成的定义与相应的库一起传送。一种方法是将结构保存在不包含
#include
s的头文件中,在这种情况下,您可以在它们上运行C预处理器,以获取不包含
#ifdef
s的文件(然后可以使用它构建和发布)


另一种方法是在构建系统中执行一些特殊的操作。例如,<代码> CMake <代码>有<代码> >“CMACK定义< /代码>”,它可以在C或C++源文件中使用,然后从中生成代码。

听起来像XY问题:如何解决错误的问题。选择C++语言还是C++语言?如果在编译某些库时定义了
CONFIG\u A
,但在编译其他库时没有定义,则表示行为未定义。在安装库时,还可以安装带有适当预处理器选项的
mylibrary.pc
文件。然后指示用户使用<代码> PKG CONFIG-CFLAGS MyLabys/COD>。这个问题提到“.c”作为源文件——这意味着这不是C++问题。你真正应该问的第一个问题是为什么结构需要被暴露和可见,以便使用你的共享对象。这样公开内部实现细节意味着您无法在不强制重新编译使用库的每个二进制文件的情况下更改库。如果有人以一种不同于您的库所期望的方式编译结构,那么它也会让您遇到一些真正有趣的bug。理想情况下,库用户不应该看到
struct
定义之类的内容-它们应该仅通过定义的API进行交互。听起来像是XY问题:如何修复问题的错误解决方案。选择C++语言还是C++语言?如果在编译某些库时定义了
CONFIG\u A
,但在编译其他库时没有定义,则表示行为未定义。在安装库时,还可以安装带有适当预处理器选项的
mylibrary.pc
文件。然后指示用户使用<代码> PKG CONFIG-CFLAGS MyLabys/COD>。这个问题提到“.c”作为源文件——这意味着这不是C++问题。你真正应该问的第一个问题是为什么结构需要被暴露和可见,以便使用你的共享对象。这样公开内部实现细节意味着您无法在不强制重新编译使用库的每个二进制文件的情况下更改库。如果有人以一种不同于您的库所期望的方式编译结构,那么它也会让您遇到一些真正有趣的bug。理想情况下,库用户不应该看到
struct
定义之类的内容-它们应该只通过定义的API进行交互。