我在mylib.h中有这样的代码,然后使用它来创建mylib.so。有没有办法检查.so中如何定义MY_MACROS?
#ifdef SWITCH_CONDITION #define MY_MACROS 0 #else #define MY_MACROS 1 #endif
如果那是一个函数,我会简单地做
nm mylib.so | grep myfunction
有没有办法对宏做同样的事情?
PS应该是因为
> grep MY_MACROS mylib.so > Binary file mylib.so matches
Steve Summit.. 5
通常,无法对宏执行此类操作。(但请参阅下文。)
理论上,预处理器宏是一个编译时概念。事实上,在C的早期实现中,预处理器是-字面-一个独立的程序,在一个单独的进程中运行,转换的C代码与#include
和#define
及#ifdef
成没有它们的C代码。实际的C编译器仅看到“预处理”代码。
现在,从理论上讲,编译器可以以某种方式保存一些宏定义的记录,也许有助于调试。我不知道有谁这样做,尽管显然使用DWARF格式的人确实可以做到!请参阅下面的评论和@ JL2210的答案。
您始终可以编写自己的显式代码来跟踪某些宏的定义。例如,我经常写代码来延长
void print_version() { printf("myprogram version %s", VERSION_STRING); #ifdef DEBUG printf(" (debug version)"); #endif printf("\n"); }
一些项目具有相当复杂的机制来跟踪对特定构建有效的编译开关。例如,在由configure
脚本管理的项目中,通常config.status
为后代提供一个文件,其中包含所有编译选项的一条记录。
通常,无法对宏执行此类操作。(但请参阅下文。)
理论上,预处理器宏是一个编译时概念。事实上,在C的早期实现中,预处理器是-字面-一个独立的程序,在一个单独的进程中运行,转换的C代码与#include
和#define
及#ifdef
成没有它们的C代码。实际的C编译器仅看到“预处理”代码。
现在,从理论上讲,编译器可以以某种方式保存一些宏定义的记录,也许有助于调试。我不知道有谁这样做,尽管显然使用DWARF格式的人确实可以做到!请参阅下面的评论和@ JL2210的答案。
您始终可以编写自己的显式代码来跟踪某些宏的定义。例如,我经常写代码来延长
void print_version() { printf("myprogram version %s", VERSION_STRING); #ifdef DEBUG printf(" (debug version)"); #endif printf("\n"); }
一些项目具有相当复杂的机制来跟踪对特定构建有效的编译开关。例如,在由configure
脚本管理的项目中,通常config.status
为后代提供一个文件,其中包含所有编译选项的一条记录。