如何在发布之前删除私人代码?

时间:2014-09-30 15:32:14

标签: c publish

我们有一个中型C代码库,提供使用我们硬件产品的API。我们提供此API的源代码,以便客户可以将其编译到他们选择的任何环境中。重要的是,源代码清晰易读,并且很容易导航,就像许多人一样。我们不会以任何方式混淆它。

在我们的代码中,我们有许多仅用于内部测试的函数和部分,包装方法,低级别检查等等。在任何方面都没有特别有趣或有害但我们并不真正想要人们使用它们或对它们是什么感到困惑。尽管代码中有关于使用它们的警告,但之前已经发生了很多次。

是否有任何工具或方法可以在发布来源之前过滤掉这些部分?

现在我们使用带注释的自定义方法,但是很难解析和维护:

/* $if : INTERNAL : some comment */
debug_code();
/* $endif : INTERNAL */

我看过使用#ifdef和预处理器,但似乎没有办法预处理特定的定义/宏而不是整个文件。我只希望预处理(因此删除)特定块,而不是所有定义和代码。

编辑:从我在下面的评论中,我们要从已发布的代码中删除的内容不应位于单独的文件中。与包装器一样,我们更喜欢将它们保留在它们包装的功能旁边,以便于查找。其他时候,我们在代码中有关于内部实现的详细注释,供我们参考,但不希望其他人看到它。

3 个答案:

答案 0 :(得分:2)

您应该将测试代码放在不同的文件中,甚至更好地使用适当的测试框架(如Google Test或CUnit)。在这种情况下,删除测试将只是删除一些文件的问题。我建议使用towrads重构,以隔离特定文件中的测试代码。

答案 1 :(得分:1)

我要考虑的两个选项是awkm4

sed '/\/\* *\$if/,/\/\* *\$endif/d'(未经测试)之类的内容会删除您已说明的评论之间的所有行。这有点粗糙,但如果它足够,它很简单,可能会很健壮。

如果你需要更复杂的东西,那么m4值得一看(参见m4的GNU实现的documentation)。 M4主要用于 这种文本操作工作。它功能强大,但其中包括足够强大,你可以将它与它结合在一起(不要被带走!)。提示:m4中的默认引号字符是左右引号 - 这并不总是方便,因此changequote函数可以成为救星;因此changequote([[,]])使[[square brackets]]引用字符。

答案 2 :(得分:1)

我发现对这类应用程序有用的一个工具是coan,它仍然是主动维护的(尽管显然它目前还没有在Mac OS X上干净地编译,如果这是一个问题)。

Coan专为代码分析而设计,它可以执行您可能不需要的许多任务。只要您没有明确#define围绕要删除的代码的预处理器宏,您就应该能够-D efine或-U ndefine。

Coan希望保持代码一致,并且可以评估预处理器宏,以便正确评估并可能消除预处理器条件。即使您没有要求它进行评估,如果定义可见,它通常会解释和简化#ifdef块。即使这种行为可以使用--no-transients选项进行更改,但它会发出警告。