條件編譯:
一般情況下,源程序中所有的行都參加編譯。但有時希望對其中一部分內容只在滿足一定條件下才進行編譯,即對一部分內容指定編譯條件,這就是“條件編譯”(conditional compile)。
常用形式:
條件編譯命令常用的有以下形式:
(1)
#ifdef 標識符
程序段1
#else
程序段2
#endif
它的作用是當所指定的標識符已經被#define命令定義過,則在程序編譯階段只編譯程序段1,否則只編譯程序段2。#endif用來限定#ifdef命令的范圍。其中,#else部分也可以沒有。
(2)
#ifndef 標識符
程序段1
#else
程序段2
#endif
它的作用是當所指定的標識符沒有被#define命令定義過,則在程序編譯階段只編譯程序段1,否則只編譯程序段2。這種形式與第一種形式的作用相反。
(3)
#if 表達式
程序段1
#else
程序段2
#endif
它的作用是當所指定的標識符值為真(非零)時,則在程序編譯階段只編譯程序段1,否則只編譯程序段2。可以事先給定一定條件,使程序在不同的條件下執行不同的功能。
例子:
題目:輸入一個字母字符,使之條件編譯,使之能根據需要將小寫字母轉化為大寫字母輸出,或將大寫字母轉化為小寫字母輸出。
代碼1
[cpp]
#include<iostream>
using namespace std;
#define upper 1
int main(){
char a;
#if upper
cout<<"lowercase to uppercase"<<endl;
cout<<"please input a char:";
cin>>a;
if(a>='a'&&a<='z'){
cout<<a<<"===>"<<char(a-32)<<endl;
}else{
cout<<"data erroe"<<endl;
}
#else
cout<<"uppercase to lowercase"<<endl;
cout<<"please input a char:";
cin>>a;
if(a>='A'&&a<='Z'){
cout<<a<<"===>"<<char(a+32)<<endl;
}else{
cout<<"data erroe"<<endl;
}
#endif
cout<<"Good Night~"<<endl;
return 0;
}
#include<iostream>
using namespace std;
#define upper 1
int main(){
char a;
#if upper
cout<<"lowercase to uppercase"<<endl;
cout<<"please input a char:";
cin>>a;
if(a>='a'&&a<='z'){
cout<<a<<"===>"<<char(a-32)<<endl;
}else{
cout<<"data erroe"<<endl;
}
#else
cout<<"uppercase to lowercase"<<endl;
cout<<"please input a char:";
cin>>a;
if(a>='A'&&a<='Z'){
cout<<a<<"===>"<<char(a+32)<<endl;
}else{
cout<<"data erroe"<<endl;
}
#endif
cout<<"Good Night~"<<endl;
return 0;
}
代碼2:
[cpp]
#include<iostream>
using namespace std;
#define upper 0
int main(){
char a;
#if upper
cout<<"lowercase to uppercase"<<endl;
cout<<"please input a char:";
cin>>a;
if(a>='a'&&a<='z'){
cout<<a<<"===>"<<char(a-32)<<endl;
}else{
cout<<"data erroe"<<endl;
}
#else
cout<<"uppercase to lowercase"<<endl;
cout<<"please input a char:";
cin>>a;
if(a>='A'&&a<='Z'){
cout<<a<<"===>"<<char(a+32)<<endl;
}else{
cout<<"data erroe"<<endl;
}
#endif
cout<<"Good Night~"<<endl;
return 0;
}
#include<iostream>
using namespace std;
#define upper 0
int main(){
char a;
#if upper
cout<<"lowercase to uppercase"<<endl;
cout<<"please input a char:";
cin>>a;
if(a>='a'&&a<='z'){
cout<<a<<"===>"<<char(a-32)<<endl;
}else{
cout<<"data erroe"<<endl;
}
#else
cout<<"uppercase to lowercase"<<endl;
cout<<"please input a char:";
cin>>a;
if(a>='A'&&a<='Z'){
cout<<a<<"===>"<<char(a+32)<<endl;
}else{
cout<<"data erroe"<<endl;
}
#endif
cout<<"Good Night~"<<endl;
return 0;
}
分析:
代碼1和代碼2的區別是upper的值分別是1和0,運行結果也證明了分別編譯了語句段1和語句段2。
[cpp]
cout<<"Good Night~"<<endl;
cout<<"Good Night~"<<endl;這個語句是在#endif之後的語句,這說明#endif只是表示了#if——#else語句的結束,而不是編譯的結束,也就是說#endif之後的語句都會正常的編譯和執行。