• C++ 基础小知识学习[1]


    #ifndef的主要作用是什么?

    为 防止重复编译
    以test.h为例:#ifndef TEST_H#define TEST_H.#endif一般是用来防止重复包含头文件第一次包含头文件时 XXX没有被定义 第二次再用时 XXX 已经被定义拉就不在包含这个头文件。条件指示符#ifndef检查预编译常量在前面是否已经被定义.如果在前面没有被定义,则条件指示符的值为真,于是从#inndef到#endif之间的所有语句都被包含进来进行处理.相反,如果#inndef指示符的值为假,则它与#endif指示符之间的行将被忽略.条件指示符#ifndef 的最主要目的是防止头文件的重复包含和编译。

                 深入:条件编译

                 预处理程序提供了条件编译的功能。 可以按不同的条件去编译不同的程序部分,因而产生不同的目标代码文件。这对于程序的移植和调试是很有用的。 条件编译有三种形式,下面分别介绍:

                 1. 第一种形式: 

                 #ifdef 标识符 
                      程序段1 
                 #else 
                      程序段2 
                 #endif  

                 它的功能是,如果标识符已被 #define命令定义过则对程序段1进行编译;否则对程序段2进行编译。如果没有程序段2(它为空),本格式中的#else可以没有,即可以写为: 
                 #ifdef 标识符 
                      程序段

                 #endif 

                 举例如下:
           #define NUM ok
           void  main()

           {
                 struct stu
                 {
                       int num;
                       char *name;
                       char sex;
                       float score;
                 } *ps;
                 ps=(struct stu*)malloc(sizeof(struct stu));
                 ps->num=102;
                 ps->name="Zhang ping";
                 ps->sex='M';
                 ps->score=62.5;
                 #ifdef NUM
                       printf("Number=%d\nScore=%f\n",ps->num,ps->score);
                 #else
                       printf("Name=%s\nSex=%c\n",ps->name,ps->sex);
                 #endif
                 free(ps);
           }  

                  由于在程序的第16行插入了条件编译预处理命令,因此要根据NUM是否被定义过来决定编译那一个printf语句。而在程序的第一行已对NUM作过宏定义,因此应对第一个printf语句作编译故运行结果是输出了学号和成绩。在程序的第一行宏定义中,定义NUM表示字符串OK,其实也可以为任何字符串,甚至不给出任何字符串,写为: #define NUM 也具有同样的意义。 只有取消程序的第一行才会去编译第二个printf语句。读者可上机试作。

                  2. 第二种形式: 
                  #ifndef 标识符 
                       程序段1 
                  #else 
                       程序段2 
                  #endif  
                  与第一种形式的区别是将“ifdef”改为“ifndef”。它的功能是,如果标识符未被#define命令定义过则对程序段1进行编译,否则对程序段2进行编译。这与第一种形式的功能正相反。 

                  3. 第三种形式: 
                  #if 常量表达式 
                       程序段1 
                  #else 
                       程序段2 
                  #endif  

                  它的功能是,如常量表达式的值为真(非0),则对程序段1 进行编译,否则对程序段2进行编译。因此可以使程序在不同条件下,完成不同的功能
                  举例如下:
           #define R 1
           void  main()

           {
                 float c,r,s;
                 printf ("input a number: ");
                 scanf("%f",&c);
                 #if R
                      r=3.14159*c*c;
                      printf("area of round is: %f\n",r);
                 #else
                      s=c*c;
                      printf("area of square is: %f\n",s);
                 #endif
           } 

                  本例中采用了第三种形式的条件编译。在程序第一行宏定义中,定义R为1,因此在条件编译时,常量表达式的值为真,故计算并输出圆面积。上面介绍的条件编译当然也可以用条件语句来实现。但是用条件语句将会对整个源程序进行编译,生成的目标代码程序很长,而采用条件编译,则根据条件只编译其中的程序段1或程序段2,生成的目标程序较短。如果条件选择的程序段很长, 采用条件编译的方法是十分必要的。

  • 相关阅读:
    423. Reconstruct Original Digits from English
    400. Nth Digit
    397. Integer Replacement
    396. Rotate Function
    365. Water and Jug Problem
    335. Self Crossing
    319. Bulb Switcher
    线段树-hdu2795 Billboard(贴海报)
    线段树---求逆序数
    线段树——单点替换区间最值
  • 原文地址:https://www.cnblogs.com/winnxm/p/1360330.html
Copyright © 2020-2023  润新知