扩展一个C预处理指令

我需要扩大单预处理指令,例如: 具有源文件和两个头,我想只有一个define从一个特定的头部扩展,使所有其他includedefine完整。扩展一个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

回到顶部