扩展单个C预处理程序指令

克里斯蒂亚诺·阿劳霍

我需要扩大单预处理指令,例如:具有源文件和两个头,我想扩大一个只define从一个特定的头部,而所有其他includedefine完整。

主要思想是,给定类似以下代码:

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运行它的最简单方法是扩展这些宏。我也欢迎其他方法来做到这一点。

lp_

你可以用玩-E-nostdinc-nostdinc++-fpreprocessedGCC的参数。

例如,您可以运行:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在扩展宏之前是否处理了预处理程序指令?

来自分类Dev

C中的预处理程序指令

来自分类Dev

C预处理程序指令和链接

来自分类Dev

C预处理程序宏扩展串联

来自分类Dev

C预处理程序宏扩展串联

来自分类Dev

此预处理程序指令C / C ++所需的说明

来自分类Dev

此预处理程序指令C / C ++所需的解释

来自分类Dev

C预处理程序指令是否每次都会重新计算?

来自分类Dev

使用__LINE__的C:宏中的预处理程序指令

来自分类Dev

通过#define预处理程序指令覆盖C ++中的“ endl”

来自分类Dev

C预处理程序和“ _asm _emit”指令

来自分类Dev

#if预处理程序指令并非总是崩溃

来自分类Dev

使用#undef预处理程序指令

来自分类Dev

Unity预处理程序指令错误?

来自分类Dev

通过预处理器指令自扩展代码

来自分类Dev

预处理程序如何处理“ #include”指令?

来自分类Dev

如何仅将C预处理程序应用于某些(#if /#endif)指令?

来自分类Dev

是否像C语言一样在fortran中有预处理程序指令?

来自分类Dev

在Visual Studio 2015 Enterprise中添加c ++预处理程序指令的位置在哪里?

来自分类Dev

C#预处理程序指令中运算符的优先级是什么?

来自分类Dev

C预处理程序的条件指令优先级和嵌套

来自分类Dev

c ++中的预处理程序指令:以下代码的输出是什么?

来自分类Dev

预处理程序指令(#if和#endif)在C中不起作用

来自分类Dev

如何仅将C预处理程序应用于某些(#if /#endif)指令?

来自分类Dev

C预处理程序的条件指令优先级和嵌套

来自分类Dev

#在Objective-C的另一个文件中定义全局预处理程序指令

来自分类Dev

预处理程序指令不可能定义或取消定义预处理程序

来自分类Dev

检测导致大量扩展代码大小的C / C ++预处理程序滥用

来自分类常见问题

##(双哈希)在预处理程序指令中做什么?

Related 相关文章

  1. 1

    在扩展宏之前是否处理了预处理程序指令?

  2. 2

    C中的预处理程序指令

  3. 3

    C预处理程序指令和链接

  4. 4

    C预处理程序宏扩展串联

  5. 5

    C预处理程序宏扩展串联

  6. 6

    此预处理程序指令C / C ++所需的说明

  7. 7

    此预处理程序指令C / C ++所需的解释

  8. 8

    C预处理程序指令是否每次都会重新计算?

  9. 9

    使用__LINE__的C:宏中的预处理程序指令

  10. 10

    通过#define预处理程序指令覆盖C ++中的“ endl”

  11. 11

    C预处理程序和“ _asm _emit”指令

  12. 12

    #if预处理程序指令并非总是崩溃

  13. 13

    使用#undef预处理程序指令

  14. 14

    Unity预处理程序指令错误?

  15. 15

    通过预处理器指令自扩展代码

  16. 16

    预处理程序如何处理“ #include”指令?

  17. 17

    如何仅将C预处理程序应用于某些(#if /#endif)指令?

  18. 18

    是否像C语言一样在fortran中有预处理程序指令?

  19. 19

    在Visual Studio 2015 Enterprise中添加c ++预处理程序指令的位置在哪里?

  20. 20

    C#预处理程序指令中运算符的优先级是什么?

  21. 21

    C预处理程序的条件指令优先级和嵌套

  22. 22

    c ++中的预处理程序指令:以下代码的输出是什么?

  23. 23

    预处理程序指令(#if和#endif)在C中不起作用

  24. 24

    如何仅将C预处理程序应用于某些(#if /#endif)指令?

  25. 25

    C预处理程序的条件指令优先级和嵌套

  26. 26

    #在Objective-C的另一个文件中定义全局预处理程序指令

  27. 27

    预处理程序指令不可能定义或取消定义预处理程序

  28. 28

    检测导致大量扩展代码大小的C / C ++预处理程序滥用

  29. 29

    ##(双哈希)在预处理程序指令中做什么?

热门标签

归档