C 如何在发布前删除专用代码?

C 如何在发布前删除专用代码?,c,publish,C,Publish,我们有一个中等大小的C代码库,为使用我们的硬件产品提供API。我们提供此API的源代码,以便客户可以将其编译到他们选择的任何环境中。很重要的一点是,源代码清晰易读,易于导航,因为很多人都是这样做的。我们不会以任何方式混淆它 在我们的代码中,我们有许多函数和部分仅用于内部测试,比如包装方法、低级检查等。这些函数和部分在任何方面都不是特别有趣或有害的,但我们不希望人们使用它们或混淆它们是什么。尽管代码中有关于使用它们的警告,但这种情况以前已经发生过很多次 在发布源代码之前,是否有任何工具或方法可以过

我们有一个中等大小的C代码库,为使用我们的硬件产品提供API。我们提供此API的源代码,以便客户可以将其编译到他们选择的任何环境中。很重要的一点是,源代码清晰易读,易于导航,因为很多人都是这样做的。我们不会以任何方式混淆它

在我们的代码中,我们有许多函数和部分仅用于内部测试,比如包装方法、低级检查等。这些函数和部分在任何方面都不是特别有趣或有害的,但我们不希望人们使用它们或混淆它们是什么。尽管代码中有关于使用它们的警告,但这种情况以前已经发生过很多次

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

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

/* $if : INTERNAL : some comment */
debug_code();
/* $endif : INTERNAL */
我已经研究过使用
#ifdef
和预处理器,但似乎没有一种方法可以同时预处理特定的定义/宏,而不是整个文件。我只希望预处理(并因此删除)特定的块,而不是代码中的所有定义和


编辑:根据我下面的评论,我们想从发布的代码中删除的内容不应该位于单独的文件中。与包装器一样,我们更喜欢将它们放在它们包装的函数旁边,以便于查找。其他时候,我们对代码中的内部实现有详细的注释,但是我们不想让其他人看到它。

< P>我会考虑的两个选项是:代码> AWK < /代码>和<代码> M4< /代码> .< 类似于
sed'/\/\***\$if/,/\/\***\$endif/d'
(未测试)的东西会删除您所演示的注释之间的所有行。这有点粗糙,但如果它足够的话,它足够简单,可能会很健壮


如果您需要更详细的说明,那么
m4
将值得一看(请参阅m4的GNU实现的详细说明)
M4
主要用于这种文本操作工作。它是强大的,但这包括足够强大,你可以用它来束缚自己(不要得意忘形!)。提示:
m4
中的默认引号字符是左引号和右引号——这并不总是很方便,因此
changequote
函数可以起到救命作用;因此,
changequote([[,]])
使
[[方括号]]
成为引号字符。

您应该将测试代码放在不同的文件中,最好使用适当的测试框架(如Google Test或CUnit)。在这种情况下,删除测试只需删除一些文件。我建议进行大规模的重构,将测试代码隔离在特定的文件中。

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

Coan是为代码分析而设计的,它可以执行许多您可能不需要的任务。只要不明确定义围绕要删除的代码的预处理器宏,就应该能够根据需要定义或定义


Coan希望保持代码的一致性,并且可以计算预处理器宏,以便正确计算并可能消除预处理器条件。即使您不要求它进行评估,如果定义可见,它通常也会解释和简化
#ifdef
块。甚至这种行为也可以用
——无瞬变
选项来改变,但它会发出警告。

我会给你一个机会。您可以向它提供源文件,就像C预处理器一样,它将为您提供经过处理的输出文件。它的语法是可自定义的,然后可能会指示它删除
debug_xyz()呼叫。嗯,如果您仅限于删除调试函数调用(使用定义良好的签名),那么即使是一个简单的Perl脚本也可能会有所帮助。另一个有用的工具是coan(),它仍然在积极维护(尽管显然它目前在Mac OS X上没有干净地编译,如果这是一个问题的话)。它很乏味,但您可以首先将该内部代码保留在模块外部,然后在外部模块/头的宏中定义它。当为内部宏构建时,您需要包含这些宏的内部版本,当为其他人构建时,您需要包含一个带有虚拟宏的版本。@AdrianoRepetti签出GPP,感谢链接。这是可行的,但可能有点过头了。而且,上次更新似乎是10年前的事了!目前我们使用python脚本来过滤内部内容,只是编辑器无法折叠我们的特殊语法,脚本的维护有点问题。@rici我认为coan可能是最容易理解和实现的。幸运的是,我们没有将#defines放在源文件中,因此我认为(基于在线文档),我们可以通过定义“内部”宏而不定义其他所有宏来过滤特定部分。如果你回答这个问题,我会接受你的。类似于我在上面的评论中所说的。是的,一个更加结构化的开发方法现在可以节省很多时间。我意识到这对我们来说是很容易的,但它值得彻底检查代码,以及放在哪里和什么地方。时间过得很好!谢谢你的评论。实际上我们已经这样做了,我们有一个测试套件,它带有一个基于swig的python包装器,允许我们通过python测试所有方法。我们不将其包含在已发布的档案中。我在问题中提到的“测试”内容不能移动到单独的文件中。与包装器一样,我们更喜欢将它们放在它们包装的函数旁边,以便于查找。其他时候我们对interna有详细的评论