扩展一个C预处理指令
我需要扩大单预处理指令,例如: 具有源文件和两个头,我想只有一个define
从一个特定的头部扩展,使所有其他include
和define
完整。扩展一个C预处理指令
主要思想是,鉴于类似的代码如下:
的defs.h:
#define FOO(X,op) int X(int a,int b) { return a op b; }
other_file.h:
#define ONE 1 #define TWO 2
#define THREE 3
#define FOUR 4
#define FIVE 5
的main.c:
"file: main.c " #include <stdio.h>
#include "defs.h"
#include "other_file.h"
FOO(add,+)
FOO(sub,-)
FOO(mul,*)
FOO(div,/)
int main()
{
printf("%d\n",add(ONE,TWO));
printf("%d\n",sub(THREE,FOUR));
printf("%d\n",mul(FIVE,FIVE));
printf("%d\n",div(25,FIVE));
return 0;
}
我会有main.c输出与包括相同,但将FOO扩展到创建的函数。我知道这个例子很愚蠢,但我打算在更大的代码数据库上运行它。
这样做的动机是在宏中定义的函数中运行cccc。运行它的最简单方法是展开这些宏。我也欢迎替代方法来做到这一点。
回答:
你可以玩GCC的-E
,-nostdinc
,-nostdinc++
和-fpreprocessed
参数。
对于你的榜样,你可以运行:
gcc -E -nostdinc -fpreprocessed main.c
和输出是:
# 1 "main.c" #include <stdio.h>
#include "defs.h"
#include "other_file.h"
FOO(add,+)
FOO(sub,-)
FOO(mul,*)
FOO(div,/)
int main()
{
printf("%d\n",add(ONE,TWO));
printf("%d\n",sub(THREE,FOUR));
printf("%d\n",mul(FIVE,FIVE));
printf("%d\n",div(25,FIVE));
return 0;
}
如果头没有那么复杂,就像在你的榜样,您可以强制海湾合作委员会预处理整个文件,即使有一些丢失的宏。例如: -
cp other_file.h other_file.h_orig echo "" > other_file.h
gcc -E -nostdinc main.c
输出:
# 1 "main.c" # 1 "<command-line>"
# 1 "main.c"
main.c:1:19: error: no include path in which to search for stdio.h
#include <stdio.h>
^
# 1 "defs.h" 1
# 3 "main.c" 2
# 1 "other_file.h" 1
# 4 "main.c" 2
int add(int a,int b) { return a + b; }
int sub(int a,int b) { return a - b; }
int mul(int a,int b) { return a * b; }
int div(int a,int b) { return a/b; }
int main()
{
printf("%d\n",add(ONE,TWO));
printf("%d\n",sub(THREE,FOUR));
printf("%d\n",mul(FIVE,FIVE));
printf("%d\n",div(25,FIVE));
return 0;
}
它将删除标题夹杂物,虽然...并且将打印您性病头一个错误,即到stderr,而不是标准输出。
这适用于你的小例子,但在更大的代码库,你可能会面临一些问题...
下面是参数从手动(海合会4.8.2)的简短摘要:
-E:在预处理阶段后停止;不要运行编译器。输出采用预处理源代码的形式,将 发送到标准输出。
-fpreprocessed:向预处理器指示输入文件已被预处理。这抑制了诸如宏 扩展,三元图转换,换行换行和 处理大多数指令。
-nostdinc:不要搜索标准系统目录中的头文件。只有你用-I选项指定的目录。
-nostdinC++:不要搜索特定于C++的标准目录中的头文件,而是仍然搜索其他标准目录 。
回答:
我们的DMS Software Reengineering Toolkit及其C Front End将做到这一点。
DMS提供通用程序解析/分析基础结构。 C前端在此基础上提供了一个全功能的C前端,并配有C预处理器。
通常情况下,DMS C预处理器的行为与标准处理器一样:它预处理所有内容,生成替代的令牌流。通常情况下,它可以配置为不处理条件(这是全有或全无),或者仅扩展指定的宏。特别是,它接受声明宏应该(不)扩展的自定义#pragma。
我不清楚这是值得付出的努力。是的,如果您认为该宏应该是非透明的,那么在某些宏使用频率较高的地方,衡量指标工具可能会产生更准确的答案。如果你认为这个宏本质上只是一个有趣的子程序,那么扩展这个宏就像内联了一个函数体,而你不会那么做计算度量。
以上是 扩展一个C预处理指令 的全部内容, 来源链接: utcz.com/qa/257213.html