是否可以根据项目设置中的某些选项在我的头文件中添加#define _MYDEFINE_
。对于Ex:假设在我公开的头文件(与库一起提供)中,我有一些宏如下所示:
#ifdef _MYDEFINE_
#define ABC 2
#else
#define ABC 4
#endif
现在,在构建我的库时,我可以在我的设置中添加_MYDEFINE_
,但我不希望库的用户在其项目设置或代码中添加_MYDEFINE_
。相反,我希望“#define _MYDEFINE_
”自动添加到标题的开头。
注意: #define _MYDEFINE_
只有在我的预处理器设置中定义时才会添加。对于其他设置,不应添加。
如果通过项目设置无法实现,是否有任何创新的方法来完成它? 欢迎任何想法。
答案 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_
这样的名称以下划线开头,后跟另一个下划线或大写字母保留给实现 - 即你不应该使用这样的东西。