我想要的不是标准的C预处理器,而是可以从某个地方接受的变体 - 可能是命令行通过-DNAME1和-UNAME2选项 - 定义了哪些宏的规范,然后消除了死码.
通过一些例子可能更容易理解我所追求的内容:
#ifdef NAME1
#define ALBUQUERQUE "ambidextrous"
#else
#define PHANTASMAGORIA "ghostly"
#endif
Run Code Online (Sandbox Code Playgroud)
如果命令是使用'-DNAME1'运行的,则输出将为:
#define ALBUQUERQUE "ambidextrous"
Run Code Online (Sandbox Code Playgroud)
如果命令是使用'-UNAME1'运行的,则输出将为:
#define PHANTASMAGORIA "ghostly"
Run Code Online (Sandbox Code Playgroud)
如果命令是在没有选项的情况下运行的,则输出将与输入相同.
这是一个简单的例子 - 我希望代码也可以处理更复杂的情况.
用现实世界但仍然简单的例子来说明:
#ifdef USE_VOID
#ifdef PLATFORM1
#define VOID void
#else
#undef VOID
typedef void VOID;
#endif /* PLATFORM1 */
typedef void * VOIDPTR;
#else
typedef mint VOID;
typedef char * VOIDPTR;
#endif /* USE_VOID */
Run Code Online (Sandbox Code Playgroud)
我想运行命令-DUSE_VOID -UPLATFORM1并获取输出:
#undef VOID
typedef void VOID;
typedef void * VOIDPTR;
Run Code Online (Sandbox Code Playgroud)
另一个例子:
#ifndef DOUBLEPAD
#if …Run Code Online (Sandbox Code Playgroud) 一堆意大利面条刚落在我的桌子上,我的任务是理解它(所以我可以重构/重新实现它).
代码是C,以及一堆全局变量,结构类型和函数调用.
我想用信息绘制代码
图:- 调用图
- 哪些结构类型用于哪些函数
- 哪个全局变量用于什么函数
希望这样可以更容易地识别连接的组件,并将它们提取到单独的模块中.
为了类似的目的,我尝试了以下软件:
- ncc
- ctags
- codeviz/gengraph
- doxygen
- egypt
- cflow
EDIT2:
- frama -c
- snavigator
- 了解
这些的缺点要么是
a)要求我能够编译代码.我的代码无法编译,因为缺少部分源代码.
b)预处理器宏的问题(如cflow,谁想要执行#if语句的两个分支).通过cpp运行会弄乱行号.
c)我出于某种原因无法让软件做我想做的事情(比如doxygen;调用图生成的文档不容易找到,因为它似乎无法绘制变量/数据类型,可能不值得花更多时间学习doxygen的配置选项).编辑:我确实遵循了这些Doxygen instrcutions,但它只绘制了头文件依赖项.
我在Linux上,所以如果该软件适用于Linux和免费软件,那将是一个巨大的优势.不确定我的老板是否明白需要购买可视化器:-(
例如:一个命令行工具列出了在哪些函数中引用符号(=函数,变量,类型)将会有很大的帮助(如addr2line,但对于类型/变量名称/函数和源代码).
//Ť