我有一个文件,其中包含数百个以下形式的预处理器宏...
#define foo (bar)
是否有一种简单的单行方法可以仅在每个尚不存在时定义它?
对于单个宏一次可以执行以下操作...
#ifndef foo
#define foo (bar)
#endif
但我有数百个这样的宏。 我希望有类似的东西......
#define_if_not_defined foo (bar)
我实际上尝试创建自己的宏
#define DEFINE_IFNDEF(foo,bar)\
#ifndef foo\
#define foo (bar)\
#endif
那么我可以替换...
#define foo(bar)
与 DEFINE_IFNDEF(foo,bar)
但显然似乎没有一个好的方法可以将预处理器指令放入预处理器宏中。
背景
我正在编写一些经过安全认证的代码,这些代码必须从一个包含数千个未经安全认证的文件的大型现有库中复制一些功能。
原始库中有几个有用的宏定义分散在大量文件中。 从代码审查的角度来看,包含整个文件将成为巨大的昂贵负担,但包含某些文件中的一些宏以避免重新发明轮子并不是问题。 因此,我从原始库中的大量文件中到处收集了很多预处理器宏,并将它们放入一个文件中。
我的库在更小的代码大小、更快的速度、更低的代码复杂性和更容易审查安全方面具有一些主要优势,但没有原始库所具有的所有功能。 所以现在一些开发人员想尝试将原始库与我的代码库并排使用。
问题是现在有数百个重复的预处理器宏会生成警告。 我们希望消除这些警告。
如果所有宏都来自同一个头文件,我可以在整批宏周围使用#ifdef。 但就我而言,事情没那么简单,我需要很多#ifdef。
简单!但不是直接在 C 中。
创建一个文本文件
defines.txt
,例如:
DEF_A=123
DEF_B=456
并通过外部脚本'make_defines.pl`传递它:
#!/usr/bin/perl
while(<>) {
my ($def, $val) = split /=/;
print "#ifndef $def\n#define $def $val#endif\n\n";
}
现在,您所需要做的就是运行它:
$ perl make_defines defines.txt > defines.h
您也可以将其添加到
makefile
defines.h: defines.txt
perl make_defines.pl $< > $@
完成。