我需要扩大单预处理指令,例如:具有源文件和两个头,我想扩大一个只define
从一个特定的头部,而所有其他include
和define
完整。
主要思想是,给定类似以下代码:
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;
}
我将使用具有相同include的main.c输出,但将FOO扩展为所创建的函数。我知道这个例子很愚蠢,但是我打算在更大的代码数据库上运行它。
这样做的动机是在宏内定义的函数中运行cccc。运行它的最简单方法是扩展这些宏。我也欢迎其他方法来做到这一点。
你可以用玩-E
,-nostdinc
,-nostdinc++
和-fpreprocessed
GCC的参数。
例如,您可以运行:
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;
}
如果标题不是那么复杂,例如您的示例,则可以强制gcc对整个文件进行预处理,即使缺少某些宏也是如此。例如:
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;
}
不过,它将删除标头包含的内容...,并在std标头上显示一条错误,该错误将发送到stderr而不是stdout。
这适用于您的小示例,但是在较大的代码库上,您可能会遇到一些问题...
这是(GCC 4.8.2)手册中参数的简短摘要:
-E:在预处理阶段之后停止;不要正确运行编译器。输出采用预处理后的源代码的形式,并将其发送到标准输出。
-fpreprocessed:向预处理器指示输入文件已被预处理。这样可以抑制宏扩展,三字图转换,转义换行符转义以及大多数指令的处理等事情。
-nostdinc:不要在标准系统目录中搜索头文件。仅使用-I选项指定的目录。
-nostdinc ++:不要在特定于C ++的标准目录中搜索头文件,但仍会搜索其他标准目录。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句