1

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

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

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

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

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

4

4 回答 4

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>
 ...
于 2010-02-12T18:16:07.083 回答
2

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

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

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

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

I've seen this before. Taking care of this is difficult and tedious, but not doing it can create serious problems with different versions of you library.

于 2010-02-12T21:40:38.807 回答
1

Have a build configuration header file and include this header file before you include any other header file. This build configuration header file can be created by using some scripting mechanism during build time.

于 2010-02-25T08:48:49.697 回答
0

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

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

于 2010-02-12T18:17:50.353 回答