我希望有一个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 (使用非贪婪匹配来匹配第一个 #endif ,而不是最后一个。)

我会将客户端特定代码放在一个单独的目录中,或者可能是需要从源代码管理中检出的另一个项目的一部分。

将一个将被删除的函数调用或(我忘记正确的术语)松散链接,以便可以将另一个函数放在其位置。

我建议使用额外的宏语言层进行代码过滤,例如 filepp 。您可以使用C预处理程序友好语法来表示哪些部分属于哪些客户端。

//%ifdef CLIENT_A
  code for client A
//%endif

//%ifdef CLIENT_B
  code for client B
//%endif

//%if "CLIENT_A" || "CLIENT_B"
  code for client A and B
//%endif

'//%'前缀使您可以编译未修改的代码。在向客户提供代码之前,您可以运行 filepp

如果你正在使用gcc,那么你可以使用:

gcc <insert files here> -E

-E选项告诉gcc只预处理源,而不是编译它们。

或者,您可以使用grep过滤掉特定文件,并让预处理器只在它们上面松散。

grep -r '#define CLIENT_CODE' ./*.h 

您也可以尝试 unifdef ,这比sunifdef简单得多。

据我所知...预处理器可以作为一个单独的步骤运行(使用正确的编译器optios)。这样,您可以使用已处理的代码执行任何操作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top