相关疑难解决方法(0)

是否有一个C预处理器根据定义/未定义的值消除#ifdef块?

原始问题

我想要的不是标准的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 c++ preprocessor

36
推荐指数
3
解决办法
1万
查看次数

Spaghetti代码可视化软件?

一堆意大利面条刚落在我的桌子上,我的任务是理解它(所以我可以重构/重新实现它).

代码是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,但对于类型/变量名称/函数和源代码).

//Ť

c linux visualization code-analysis

26
推荐指数
2
解决办法
3268
查看次数

标签 统计

c ×2

c++ ×1

code-analysis ×1

linux ×1

preprocessor ×1

visualization ×1