是否可以使用一些项目设置或makefile选项将一些宏定义到头文件中?

时间:2010-02-12 18:12:15

标签: c makefile project-settings

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

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

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

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

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

4 个答案:

答案 0 :(得分:4)

大多数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>
 ...

答案 1 :(得分:2)

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

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

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

例如,如果_MY_DEFINE_影响声明结构的布局或其他标题中声明的数组的大小,那么如果用户包含#define ABC 4的标题,并且该库假定为#define ABC 2,那么您将是为您的用户引入一些令人讨厌的错误以便追踪。

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

答案 2 :(得分:1)

拥有构建配置头文件,并在包含任何其他头文件之前包含此头文件。可以在构建期间使用某些脚本机制来创建此构建配置头文件。

答案 3 :(得分:0)

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

作为一个不相关的旁边,请注意像_MYDEFINE_这样的名称以下划线开头,后跟另一个下划线或大写字母保留给实现 - 即你不应该使用这样的东西。