1
2
3
|
#ifdef 語句1
// 程序2
#endif
|
可翻譯爲:若是
宏定義了語句1則程序2。
代碼舉例:新建define.cpp文件
1
2
3
4
5
6
7
8
9
|
#include <iostream>
using
namespace
std;
int
main(
int
argc,
char
* argv[] )
{
#ifdef DEBUG
cout <<
"Beginning execution of main()"
<< endl;
#endif
return
0;
}
|
運行結果爲:
1
|
Press any key to continue
|
改寫
代碼以下:
1
2
3
4
5
6
7
8
9
10
|
#include <iostream>
using
namespace
std;
#define DEBUG
int
main(
int
argc,
char
* argv[] )
{
#ifdef DEBUG
cout <<
"Beginning execution of main()"
<< endl;
#endif
return
0;
}
|
運行結果爲:
1
2
|
Beginning execution of main()
Press any key to continue
|
1
2
3
|
#define DEBUG
#ifdef DEBUG
#endif
|
而在define.cpp源文件中,代碼修改以下:
1
2
3
4
5
6
7
8
9
|
#include <iostream>
#include "head.h"
int
main(
int
argc,
char
* argv[] )
{
#ifdef DEBUG
cout<<
"Beginning execution of main()"
<< endl;
#endif
return
0;
}
|
運行結果以下:
1
2
|
Beginning execution of main()
Press any key to continue
|
結論:
C語言
之詳解#ifdef等宏
這幾個宏是爲了進行
條件編譯。通常狀況下,源程序中全部的行都參加
編譯。可是有時但願對其中一部份內容只在知足必定條件才進行
編譯,也就是對一部份內容指定編譯的條件,這就是「
條件編譯」。有時,但願當知足某條件時對一組語句進行
編譯,而當條件不知足時則編譯另外一組語句。
條件編譯命令最多見的形式爲:
1
2
3
4
5
|
#ifdef 標識符
// 程序段1
#else
// 程序段2
#endif
|
其中#else部分也能夠沒有,即:
1
2
3
|
#ifdef
// 程序段1
#endif
|
這裏的「
程序段」能夠是語句組,也能夠是命令行。這種
條件編譯能夠提升C
源程序的通用性。若是一個C源程序在不一樣
計算機系統上運行,而不一樣的計算機又有必定的差別。例如,咱們有一個
數據類型,在Windows平臺中,應該使用long類型表示,而在其餘平臺應該使用float表示,這樣每每須要對
源程序做必要的修改,這就下降了程序的通用性。能夠用如下的
條件編譯:
1
2
3
4
5
|
#ifdef WINDOWS
# define MYTYPE long
#else
# define MYTYPE float
#endif
|
若是在Windows上
編譯程序,則能夠在程序的開始加上
1
|
#define WINDOWS
|
這樣則
編譯下面的命令行:
1
|
#define MYTYPE long
|
若是在這組
條件編譯命令以前曾出現如下命令行:
1
|
#define WINDOWS 0
|
1
2
3
|
#ifdef DEBUG
print (
"device_open(%p)\n"
, file);
#endif
|
若是在它的前面有如下命令行:
1
|
#define DEBUG
|
則在程序運行時輸出file
指針的值,以便調試分析。調試完成後只需將這個define命令行刪除便可。有人可能以爲不用
條件編譯也可達此目的,即在調試時加一批printf語句,調試後一一將printf語句刪除去。的確,這是能夠的。可是,當調試時加的printf語句比較多時,修改的工做量是很大的。用
條件編譯,則沒必要一一刪改printf語句,只需刪除前面的一條「#define DEBUG」命令便可,這時全部的用DEBUG做
標識符的條件編譯段都使其中的printf語句不起做用,即起統一控制的做用,如同一個「開關」同樣。
有時也採用下面的形式:
1
2
3
4
5
|
#ifndef 標識符
// 程序段1
#else
// 程序段2
#endif
|
以上兩種形式用法差很少,根據須要任選一種,視方便而定。
1
2
3
4
5
|
#if 表達式
// 程序段1
#else
// 程序段2
#endif
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#define LETTER 1
int
main(
int
argc,
char
* argv[] )
{
char
str[20] =
"C Language"
;
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);
}
return
0;
}
|
運行結果爲:
1
|
C LANGUAGE
|
如今先定義LETTER爲1,這樣在預處理
條件編譯命令時,因爲LETTER爲真(非零),則對第一個if語句進行編譯,運行時使小寫字母變大寫。若是將程序第一行改成:
1
|
#define LETTER 0
|
1
|
c language
|