📜  C预处理程序和宏

📅  最后修改于: 2020-10-04 12:24:07             🧑  作者: Mango

在本教程中,将向您介绍c预处理程序,并在示例的帮助下学习使用#include,#define和条件编译。

在C编程中预处理器的工作

C预处理程序是一个宏预处理程序(允许您定义宏),可以在编译程序之前对其进行转换。这些转换可以包括头文件,宏扩展等。

所有预处理指令均以#符号开头。例如,

#define PI 3.14

C预处理程序的一些常见用法是:


包括头文件:#include

#include预处理程序用于将头文件包含到C程序中。例如,

#include 

在这里, stdio.h是头文件。 #include preprocessor指令将上述行替换为stdio.h头文件的内容。

这就是为什么在使用scanf()printf()类的功能之前,需要使用#include 的原因。

您还可以创建自己的包含函数声明的头文件,并使用此预处理程序指令将其包含在程序中。

#include "my_header.h"

访问此页面以了解有关使用头文件的更多信息。


使用#define的宏

宏是被命名的代码片段。您可以使用#define预处理程序指令在C中定义宏。

这是一个例子。

#define c 299792458  // speed of light

在这里,当我们在程序中使用c时,它将替换为299792458


示例1:#define预处理程序

#include 
#define PI 3.1415

int main()
{
    float radius, area;
    printf("Enter the radius: ");
    scanf("%f", &radius);

    // Notice, the use of PI
    area = PI*radius*radius;

    printf("Area=%.2f",area);
    return 0;
}

像宏一样的功能

您还可以定义以类似于函数调用的方式工作的宏。这称为类函数宏。例如,

#define circleArea(r) (3.1415*(r)*(r))

程序每次遇到circleArea(argument) ,都会将其替换为(3.1415*(argument)*(argument))

假设我们传递了5作为参数,则它扩展如下:

circleArea(5) expands to (3.1415*5*5)

示例2:使用#define预处理程序

#include 
#define PI 3.1415
#define circleArea(r) (PI*r*r)

int main() {
    float radius, area;

    printf("Enter the radius: ");
    scanf("%f", &radius);
    area = circleArea(radius);
    printf("Area = %.2f", area);

    return 0;
}

访问此页面以了解有关宏和#define预处理器的更多信息。


条件编译

在C编程中,您可以指示预处理器是否包含代码块。为此,可以使用条件指令。

它类似于if语句,但有一个主要区别。

在执行期间对if语句进行测试,以检查是否应执行代码块,而条件语句用于在执行之前在程序中包含(或跳过)代码块。


有条件使用

  • 根据机器,操作系统使用不同的代码
  • 在两个不同的程序中编译相同的源文件
  • 从程序中排除某些代码,但保留以备将来参考

如何使用条件式?

使用条件, #ifdef#if#defined#else#elseif指令被使用。


#ifdef指令

#ifdef MACRO     
   // conditional codes
#endif

在此,仅当定义了MACRO时 ,条件代码才包含在程序中。


#if,#elif和#else指令

#if expression
   // conditional codes
#endif

在这里, 表达式是整数类型的表达式(可以是整数, 字符,算术表达式,宏等)。

仅当表达式的计算结果为非零值时,条件代码才会包含在程序中。

可选的#else指令可与#if指令一起使用。

#if expression
   conditional codes if expression is non-zero
#else
   conditional if expression is 0
#endif

您还可以使用#elif将嵌套条件添加到#if...#else

#if expression
    // conditional codes if expression is non-zero
#elif expression1
    // conditional codes if expression is non-zero
#elif expression2
    // conditional codes if expression is non-zero
#else
    // conditional if all expressions are 0
#endif

#defined

特殊运算符 #defined用于测试是否定义了某个宏。通常与#if指令一起使用。

#if defined BUFFER_SIZE && BUFFER_SIZE >= 2048
  // codes

预定义的宏

这是C编程中的一些预定义宏。

Macro Value
__DATE__ A string containing the current date
__FILE__ A string containing the file name
__LINE__ An integer representing the current line number
__STDC__ If follows ANSI standard C, then the value is a nonzero integer
__TIME__ A string containing the current date.

示例3:使用__TIME__获取当前时间

以下程序使用__TIME__宏输出当前时间。

#include 
int main()
{
   printf("Current time: %s",__TIME__);   
}

输出

Current time: 19:54:39

推荐读物

  • 线控
  • 预处理输出
  • 其他指令