Linux
如何僅列印 C 源文件中的主要功能?
例如,
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-kinds
,c-types
而且兩者都可以工作,但這kinds
是我唯一的手冊。也許與ctags
vs exuberant有關ctags
。