【问题标题】:How to search and replace a particular code line in C source using Perl/anything else?如何使用 Perl/其他任何东西搜索和替换 C 源代码中的特定代码行?
【发布时间】:2011-04-07 22:14:05
【问题描述】:

我有一个分布在许多源文件 (*.c) 中的 C 源代码。出于移植原因,我需要注释掉所有源文件中的以下语句

fprintf(stderr,"......",....);

问题是这些 fprintfs 可能是多行语句,这意味着在源文件的两行中分成两行或多行,并带有换行符(在一行末尾输入回车)。

我怎样才能找到分散在所有源文件中的此类 fprintfs,将它们替换为 多行 C 注释为:

/*
*/

由于它们是多行的,源代码编辑器的查找和替换命令没有帮助。

我正在尝试使用 PERL 脚本读取源文件,但是解析它们以执行此操作但不能。

任何指针都会很有用。

谢谢。 -AD。

【问题讨论】:

标签: c perl replace


【解决方案1】:

你要找的东西叫做“coccinelle”,它是C语言的语义补丁工具,通过它你可以很容易地做到这一点。即。 http://coccinelle.lip6.fr/

【讨论】:

    【解决方案2】:

    只是

    #undef fprintf
    #define fprintf(stream, format, ...) 42
    

    在您的文件顶部并感到高兴。

    【讨论】:

    • @goldenmean: fprintf 返回一个int(对于写入的字符数;如果出现错误,则为负数)。我认为最好将#define 用于int 的函数并简单地删除所有副作用(而不是简单地删除它)。特别是42,我认为任何正整数(不是0)都可以; 42 是一个不错的选择。
    • @pmg: 好的,所以这个宏将替换每次出现的 fprintf(..); 42;只是好奇为什么不是 0;如果宏定义了 0 或一些 -ve 数字会发生什么。无论如何 fprintf 正在被另一个数字完全取代,我不认为该数字需要是 +ve 或其他东西。我说的对吗?
    • @goldenmean:我认为没有人曾经将printf 的返回值用于任何事情。仅涵盖最终过热的程序员:if (printf("%d\n", foo) < 0) exit(PRINTF_ERROR);。在没有任何此类测试(通常)的情况下,任何整数(或没有)都一样好。
    • 这个问题是它将替换每个 fprintf,而不仅仅是 fprinting 到 stderr,这可能是也可能不是问题。 (如果程序对某些文件 IO 使用 fprintf,这个定义会破坏它)
    • “我认为没有人曾经将 printf 的返回值用于任何事情。” - 在某些需要知道输出了多少字节的应用程序中,值非常重要。
    【解决方案3】:

    对于纯 perl 解决方案,请尝试以下操作:

    我的 $all_lines; { #(如果适用,限制 $/ 的范围) 本地 $/; #一口气吞下整个文件 $all_lines = $all_lines =~ s|(\bfprintf\s*\(\s*stderr\s*,.*?\)\s*;)|/* $1 */|sg; }

    【讨论】:

      猜你喜欢
      • 2015-08-01
      • 2013-10-13
      • 1970-01-01
      • 1970-01-01
      • 2015-06-17
      • 2020-11-19
      • 1970-01-01
      • 2014-03-23
      • 1970-01-01
      相关资源
      最近更新 更多