题
我希望有一个C预处理器,它可以从源代码中过滤掉一些#define语句,而不会改变任何其他内容。
为什么呢?如果源被分发给另一个客户端,这应该用于从源中删除一些客户端特定的代码。
有人知道现有的解决方案吗?
谢谢! 西蒙
解决方案
您可以使用awk而不是CPP吗?在代码中添加一些标记,围绕要删除的代码段。例如:
(...)
//BEGIN_REMOVE_THIS_CODE
printf("secret code");
//END_REMOVE_THIS_CODE
(...)
然后写一个awk脚本来删除这段代码,比如......
BEGIN { write=1;}
/^\/\/BEGIN_REMOVE_THIS_CODE/ { write=0; next;}
/^\/\/END_REMOVE_THIS_CODE/ { write=1; next;}
{
if(write==1) print <*>;
}
其他提示
这听起来就像我在是否有一个C预处理器根据定义的值消除ifdef块。我得到的最好的答案是 sunifdef
,或者是'unifdef之子',它在一些过度扭曲的条件代码上可靠地为我工作(在各种各样的平台上开发了20多年累积的crud关于如何进行特定于平台的编译的理论不充分。)
我认为你不需要预处理器。如果您的代码中没有嵌套的 #ifdef
,那么任何正则表达式引擎都可以删除位于 #ifdef CLIENT
和 #endif 之间的任何内容。 code>(使用非贪婪匹配来匹配第一个
#endif
,而不是最后一个。)
我会将客户端特定代码放在一个单独的目录中,或者可能是需要从源代码管理中检出的另一个项目的一部分。
将一个将被删除的函数调用或(我忘记正确的术语)松散链接,以便可以将另一个函数放在其位置。
如果你正在使用gcc,那么你可以使用:
gcc <insert files here> -E
-E选项告诉gcc只预处理源,而不是编译它们。
或者,您可以使用grep过滤掉特定文件,并让预处理器只在它们上面松散。
grep -r '#define CLIENT_CODE' ./*.h
您也可以尝试 unifdef ,这比sunifdef简单得多。
据我所知...预处理器可以作为一个单独的步骤运行(使用正确的编译器optios)。这样,您可以使用已处理的代码执行任何操作。
不隶属于 StackOverflow