Linux

如何僅列印 C 源文件中的主要功能?

  • July 12, 2021

例如,cat foo.c將列印整個文件,cat foo.c | grep main將列印定義 main 函式的行。

那麼我將如何列印整個main函式呢?

(我在 Ubuntu 上)

很大程度上取決於來源,以及對來源的控制、期望的結果等。

以最簡單的形式:

sed -n '/^int main(/,/^}/p' file.c

這將列印從int main(直到}包含的行之間的所有內容。


如果您需要擴展宏,您可以使用 c 預處理器cpp,然後執行它indent,最後使用sed. indent在任何情況下都可以確保程式碼格式正確等。範例:

  • cpp擴展宏。(在大型程式碼庫上可能很麻煩。)
  • indent格式化程式碼以進行匹配(縮進)。-bls選項確保int並且在main同一行。
  • sed提取main部分。
cpp file.c | 
indent --linux-style --standard-output -bls | 
sed -n '/^int main(/,/^}/p'

或者主要確保縮進是好的:

indent --linux-style --standard-output -bls file.c | 
sed -n '/^int main(/,/^}/p'

可選擇添加-fc1以使評論塊內容不在第一列開始。(例如,如果塊註釋有一行以int main(. 開頭)


再次; 這完全取決於您對輸入的控製程度,您想要、不想要、需要多少變化等。


例子:

#include <stdio.h>

#define ANSWER(q, s) (q |= (s))
#define WHAT for

void foo(int a) {
   printf("%x\n", a | 2);
}

int

main(
   int argc,
   char *argv[])
{
   /* Some
    * comment
    * */
   int i, k = 40;
       ANSWER(k, 2);
   // Another comment
WHAT (i = 0; i < 3; ++i) {
   foo(i);
}
   return 0;
}

/*

int main(void) {
   return 0;
}

*/

結果(使用 cpp、縮進、sed):

int main(int argc, char *argv[])
{

   int i, k = 40;
   (k |= (2));

   for (i = 0; i < 3; ++i) {
       foo(i);
   }
   return 0;
}

如果您需要找到main開始的行或任何與此相關的函式,一個選項也是ctags,即:

$ ctags -x --c-kinds=f test.c | awk '$1 == "main"'

兩者都見過c-kindsc-types而且兩者都可以工作,但這kinds是我唯一的手冊。也許與ctagsvs exuberant有關ctags

引用自:https://unix.stackexchange.com/questions/657961