#ifdef

#ifdef是一句电脑程序语句。可以用它区隔一些与特定头文件程序库和其他文件版本有关的代码。可翻译为:如果宏定义了语句1则执行程序2。

#ifdef语句1
//程序2
#endif

作用:我们可以用它区隔一些与特定头文件程序库和其他文件版本有关的代码。

代码举例:新建define.cpp文件

#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
#ifdef DEBUG
cout << "Beginning execution of main()" << endl;
#endif
return 0;
}

运行结果为:

Press any key to continue

改写代码如下:

#include <iostream>
using namespace std;
#define DEBUG
int main(int argc, char *argv[])
{
#ifdef DEBUG
cout << "Beginning execution of main()" << endl;
#endif
return 0;
}

运行结果为:

Beginning execution of main()

Press any key to continue

一般定义在头文件

更一般的情况是,#define语句是包含在一个特定的头文件中。比如,新建头文件head.h,在文件中加入代码:

#define DEBUG
#ifdef DEBUG
#endif

而在define.cpp源文件中,代码修改如下:

#include <iostream>
#include "head.h"
using namespace std;
 
int main(int argc,char *argv[])
{
#ifdef DEBUG
cout << "Beginning execution of main()" << endl;
#endif
return 0;
}

运行结果如下:

Beginning execution of main()
Press any key to continue

用于条件编译

为了进行条件编译。一般情况下,源程序中所有的行都参加编译。但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。有时,希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。

条件编译命令最常见的形式为:

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

它的作用是:当标识符已经被定义过(一般是用#define命令定义),则对程序段1进行编译,否则编译程序段2。起统一控制的作用,如同一个“开关”一样。

其中#else部分也可以没有,即:

#ifdef 标识符
//程序段1
#endif

这里的“程序段”可以是语句组,也可以是命令行。这种条件编译可以提高C源程序的通用性。如果一个C源程序在不同计算机系统上运行,而不同的计算机又有一定的差异。例如,我们有一个数据类型,在Windows平台中,应该使用long类型表示,而在其他平台应该使用float表示,这样往往需要对源程序作必要的修改,这就降低了程序的通用性。可以用以下的条件编译:

#ifdef WINDOWS
#define MYTYPE long
#else
#define MYTYPE float
#endif

如果在Windows上编译程序,则可以在程序的开始加上

#define WINDOWS

有时也采用下面的形式:

#ifndef 标识符
//程序段1
#else
//程序段2
#endif

只是第一行与第一种形式不同:将“ifdef”改为“ifndef”。它的作用是:若标识符未被定义则编译程序段1,否则编译程序段2。这种形式与第一种形式的作用相反。

还有一种形式,就是#if后面的是一个表达式,而不是一个简单的标识符

#if 表达式
//程序段1
#else
//程序段2
#endif

它的作用是:当指定的表达式值为真(非零)时就编译程序段1,否则编译程序段2。可以事先给定一定条件,使程序在不同的条件下执行不同的功能。

例如:输入一行字母字符,根据需要设置条件编译,使之能将字母全改为大写输出,或全改为小写字母输出。

#define LETTER 1
int main(int argc,char *argv[])
{
    char str[20] = "CLanguage";
    char c;
    int i=0;
    while((c = str[i]) != '\0')
    {
        i++;
        #if LETTER
        if(c>='a'&&c<='z')
            c=c-32;
        #else
        if(c>='A'&&c<='Z')
            c=c+32;
        #endif
        printf("%c",c);
    }
    return0;
}

运行结果为:

CLANGUAGE

先定义LETTER为1,这样在预处理条件编译命令时,由于LETTER为真(非零),则对第一个if语句进行编译,运行时使小写字母变大写。如果将程序第一行改为:

#define LETTER 0

则在预处理时,对第二个if语句进行编译处理,使大写字母变成小写字母(大写字母与相应的小写字母的ASCII代码差32)。此时运行情况为:

clanguage

有人会问:不用条件编译命令而直接用if语句也能达到要求,用条件编译命令有什么好处呢?的确,此问题完全可以不用条件编译处理,但那样做目标程序长(因为所有语句都编译),而采用条件编译,可以减少被编译的语句,从而减少目标的长度。当条件编译段比较多时,目标程序长度可以大大减少。

有人可能还会发现有#if defined (x)这样的使用,x代表的是一个宏,如果定义了x这个宏,那么,编译器会编译中间的代码。在使用上,其实#ifdef和#if defined(x)的用法一致,而#ifndef也和#if !defined(x)的用法一致。

while(str[i]!='\0')是什么意思

判断str[i]的值是否等于'\0'字符,如果不等于就执行while后面语句,否则跳出循环;

在C语言中没有专门的字符串变量,通常用一个字符数组来存放一个字符串。字符串总是以'\0'作为串的结束符。因此当把一个字符串存入一个数组时,也把结束符 '\0'存入数组,并以此作为该字符串是否结束的标志。有了'\0'标志后,就不能再用字符数组的长度来判断字符串的长度了。

//参考代码如下:
//计算字符串长度 
#include<stdio.h>
int main()
{
    int i=0;
    char a[200];
    gets(a);
    while(a[i]!='\0'){//判断字符串是否结束,不结束自加1 
        i++;
    }
    printf("%d\n",i);//输出长度 
    return 0;
}
//输入:asdfdasf 
//输出:8

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值