C++ 是否可以通过NM仅打印用户定义的变量?

C++ 是否可以通过NM仅打印用户定义的变量?,c++,mingw,nm,C++,Mingw,Nm,在nm的输出中有很多系统变量,看起来是这样的 N _CRT_MT _CRT_fmode _CRT_glob Dictionary::variable4 namespace1::variable1 __cpu_features __crt_xc_end__ __crt_xc_start__ __crt_xi_end__ __crt_xi_start__ __crt_xl_start__ __crt_xp_end__ __crt_xp_start__ __crt_xt_end__ __crt_xt_

在nm的输出中有很多系统变量,看起来是这样的

N
_CRT_MT
_CRT_fmode
_CRT_glob
Dictionary::variable4
namespace1::variable1
__cpu_features
__crt_xc_end__
__crt_xc_start__
__crt_xi_end__
__crt_xi_start__
__crt_xl_start__
__crt_xp_end__
__crt_xp_start__
__crt_xt_end__
__crt_xt_start__
__tls_end__
__tls_start__
__xl_a
__xl_c
__xl_d
__xl_z
_argc
_argv
_bss_end__
_bss_start__
_data_end__
_data_start__
_end__
_fmode
_tls_end
_tls_index
_tls_start
_tls_used
mingw_initltsdrot_force
mingw_initltsdyn_force
mingw_initltssuo_force
variable0
variable10

是否可以只打印用户定义的变量?在本例中为variable10,Dictionary::variable1,Dictionary::variable4,N?

我不知道。但至少可以安全地筛选以双下划线或下划线+大写字母开头的所有变量,因为这些变量是为实现保留的:

$ nm -j foo | grep -v '^_[A-Z]\|^__\+[A-Za-z]'
N
Dictionary::variable4
namespace1::variable1
_argc
_argv
_bss_end__
_bss_start__
_data_end__
_data_start__
_end__
_fmode
_tls_end
_tls_index
_tls_start
_tls_used
mingw_initltsdrot_force
mingw_initltsdyn_force
mingw_initltssuo_force
variable0
variable10
您可能可以通过添加可靠地表示实现定义的标识符的附加模式来进行更多过滤

或者,创建一个空的可执行文件(即不包含用户定义符号的可执行文件),并通过以下方式计算每个可执行文件上
nm
的输出差:


@DeadMG我不能执行额外的过滤,因为这个系统变量名是不可预测的。@Alex好吧,看看我的第二个方法,它实际上运行得很好。等等,让我展示一个更完整的例子。谢谢,我会检查它。但我在Windows7下工作,有没有类似于comm的软件?@Alex我不知道。但是既然您使用的是
nm
,那么您就不能使用cygwin吗?缺少合适的组合工具是我放弃Windows作为开发平台的原因。它只是不够强大。好吧,不管怎样,我可以用matlab脚本手动完成这项工作。但我有一个疑问-也许.cpp文件将包含一些额外的细节(而不仅仅是void main{}),这将引发新系统变量的出现。
$ # Preparation
$ echo 'int main() { }' > mt.cpp
$ g++ -o mt.out mt.cpp
$ nm -j mt.out > mt.symbols
$ 
$ nm -j your_exe > your_exe.symbols
$ comm -23 your_exe.symbols mt.symbols
N
Dictionary::variable4
namespace1::variable1
variable0
variable10