C语言中的预处理器示例

Sag*_*ari -2 c c++

我想要一些C预处理器指令的例子,例如:

#define pi 3.14
#define MAX 100
Run Code Online (Sandbox Code Playgroud)

我只知道这个.我想知道更多关于预处理器指令的信息.

Tom*_*ter 10

最大的例子是

 #include<stdio.h>
Run Code Online (Sandbox Code Playgroud)

但是有相当数量.您还可以定义宏:

 #define MAX(X,Y) (((X) > (Y)) ? (X) : (Y))
Run Code Online (Sandbox Code Playgroud)

并使用标题守卫

#ifndef A_H
#define A_H

// code

#endif
Run Code Online (Sandbox Code Playgroud)

编译器定义了专有扩展,允许您提供处理指令:

#ifdef WIN32 // WIN32 is defined by all Windows 32 compilers, but not by others.
#include <windows.h>
#else
#include <unistd.h>
#endif
Run Code Online (Sandbox Code Playgroud)

并且if语句也可用于评论:

#if 0

int notrealcode = 0;

#endif
Run Code Online (Sandbox Code Playgroud)

我经常使用预处理器来进行调试构建:

#ifdef EBUG
printf("Debug Info");
#endif

$ gcc -DEBUG file.c //debug build
$ gcc file.c //normal build
Run Code Online (Sandbox Code Playgroud)

正如其他人都指出的那样,有很多地方可以获得更多信息:

  • 始终用括号保护宏扩展中的所有参数.考虑"MAX(x | 3,y&4)"的扩展; 没有将'(X> Y)'括号为'((X)>(Y))',它不会评估您的期望值. (2认同)
  • @Tyler:不会.它们保留供实现使用 - 由系统库和编译器使用.换句话说,它们被保留*用于*头文件,例如/ usr/include/linux下的头文件.这就是重点.这些标题(系统标题)允许使用特殊的名称类,以便它们可以避免与*your*代码命名冲突.因此,如果*your*代码开始使用*他们的*名称,那么整个系统就会崩溃,并且您可能会遇到冲突. (2认同)

Ale*_*lli 5

您是否完全熟悉基础知识,例如维基百科所涵盖的内容?或者你需要一个初级教程?或者是什么?