【问题标题】:Is it possible to define some macro into the header file using some project settings or makefile options?是否可以使用一些项目设置或 makefile 选项在头文件中定义一些宏?
【发布时间】:2010-02-12 18:12:14
【问题描述】:

是否可以根据项目设置中的某些选项在我的头文件中添加#define _MYDEFINE_。例如:假设在我公开的头文件(与库一起提供)中,我有一些宏,如下所示:

#ifdef _MYDEFINE_
#define ABC 2
#else
#define ABC 4
#endif

现在,在构建我的库时,我可以在我的设置中添加_MYDEFINE_,但我不希望库的用户在他的项目设置或代码中添加_MYDEFINE_。相反,我希望“#define _MYDEFINE_”自动添加到标题的开头。

注意: #define _MYDEFINE_ 只有在我的预处理器设置中定义时才应添加。对于其他设置,不应添加。

如果无法通过项目设置实现,是否有任何创新的方法来完成它? 欢迎任何想法。

【问题讨论】:

    标签: c makefile project-settings


    【解决方案1】:

    大多数 C 编译器接受选项 -D 来定义符号:

    gcc -D_MYDEFINE_ file.c
    

    在这种形式中,它被隐式设置为 1。否则可以显式设置一个值:

    gcc -D_MYDEFINE_=4 file.c
    

    允许使用多个-D,即使在使这变得困难的操作系统(例如 VMS)上也是如此。

    gcc -DSYMBOL1 -DSYMBOL2 -DSYMBOL3 file.c
    

    这些行为就像对应的#define 语句出现在每个命令行文件的第一行之前一样。

    #define SYMBOL1 1  (these are virtually present due to command line -D options)
    #define SYMBOL2 1
    #define SYMBOL3 1
    
    (actual source code begins)
    /*
     * file.c:  
     */
    #include <ctype.h>
    #include <stdlib.h>
     ...
    

    【讨论】:

      【解决方案2】:

      您可能需要考虑_MYDEFINE_ 对您的图书馆有什么影响。

      如果您希望它的效果仅用于开发(如 NDEBUG),使用 -D/D 编译器选项应该没问题。

      如果它的影响会影响用户使用库时发生的事情,那么您可能需要做一些更详细的事情。在后一种情况下,您将创建库的两个版本,您可能希望将它们命名为:如 libX-ABC2.a 和 libX-ABC4.a。而且您还需要两个版本的包含文件,并且您可能需要生成配置标头,并在每个版本中适当地定义 _MYDEFINE_。如果您的库已安装,您可能需要头文件的版本化包含目录。

      例如,如果 _MY_DEFINE_ 影响已声明结构的布局或其他标头中已声明数组的大小,让用户在假定 #define ABC 2 的库中包含 #define ABC 4 的标头,您将引入一些讨厌的错误供您的用户追踪。

      我以前见过这个。解决这个问题既困难又乏味,但不这样做可能会给您的库的不同版本造成严重问题。

      【讨论】:

        【解决方案3】:

        有一个构建配置头文件并在包含任何其他头文件之前包含此头文件。这个构建配置头文件可以在构建时使用一些脚本机制来创建。

        【讨论】:

          【解决方案4】:

          您似乎正在寻找“/D”编译器标志(地球上几乎所有 C 编译器中都相同的少数标志之一)。用法类似于:cc /D_MYDEFINE_ myfile.c

          顺便说一句,请注意像 _MYDEFINE_ 这样以下划线开头后跟另一个下划线或大写字母的名称是为实现保留的——也就是说,你不应该使用这样的东西。

          【讨论】:

          • 我刚刚添加了 MYDEFINE 作为示例。我真的不会那样命名我的常量。但是,/D 是否将定义添加到您公开的头文件中?我是从一个带有暴露头文件的库的角度来讨论的,这些头文件将被某些应用程序使用。
          • @Jay:不,“/D”通常在 makefile 中,而不是在任何源文件中。所以基本上,你会在构建库时将它添加到你的 makefile 中。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-09-08
          • 2011-07-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-09
          • 1970-01-01
          相关资源
          最近更新 更多