如何编写一个 shell 脚本来查找给定 C 程序中的所有全局变量?
我不需要像这样的长队
global_vars=$(grep -E '^[[:space:]]*[a-zA-Z_][a-zA-Z0-9_]*[[:space:]]+[a-zA-Z_][a-zA-Z0-9_]*[[:space:]]*;' "$c_file" | awk '{print $2}')
,而是一个真正的解决方案/策略。
我想我可以以某种方式检查变量是否由大括号封装,这意味着它不是全局的,但我不知道如何实现它,而且看起来很复杂。
这取决于问题的限制程度。如果您无法对所使用的编码约定做出假设,则必须使用比正则表达式更强大的工具。如果您可以假设一些事情,这是我曾经编写的脚本的起点:
BEGINFILE {
current_function = ""
}
# Start of function.
/^\w.*\(.*\)\s*{?\s*$/ {
current_function = $0
}
# End of function.
/^}\s*$/ {
current_function = ""
}
如果
current_function
为空(在 awk 中意味着它是“假”),那么你不在函数内部。然后你可以做这样的事情:
! current_function &&
/<regex which matches non-pathological variable declarations>/ &&
! /<regex of things that might be confused for a variable, like typedefs, macros, etc>/ {
print "global: " $0
}