1. 程式人生 > >C++primer第五版 NDEBUG預處理變數,輸出vector內容,有條件地輸出指向過程有關的資訊。

C++primer第五版 NDEBUG預處理變數,輸出vector內容,有條件地輸出指向過程有關的資訊。

 除錯程式碼時,有時會用到一種類似於標頭檔案保護的技術,這就要用到兩項預處理功能:assert和NDEBUG。

前處理器定義了幾個對於程式除錯很有用的名字:

__FILE__ 存放檔名的字串字面值

__LINE__ 存放當前行號的整型字面值

__TIME__ 存放檔案編譯時間的字串字面值

__DATE__ 存放檔案編譯日期的字串字面值

另外還有__func__.輸出當前除錯的函式的名字,不過這是C++11新增的,有些老編譯器不支援。

可以使用這些常量在錯誤訊息中提供更多資訊。

// primer_6_5_3.cpp : Defines the entry point for the application.
// NDEBUG預處理變數
// 輸出vector內容,有條件地輸出指向過程有關的資訊。

#include "stdafx.h"
#include<iostream>
#include<vector>
#include<string>
using namespace std;

int main()
{
	string word;
	vector<string> vec;  //宣告一個存放string物件的容器vec
	void display_word(vector<string>,const int);  //宣告顯示單詞的函式
	cout << "input the words: ('q' to over )" << endl;
	cin >> word;
	while(word!="q")  //往vec容器內新增元素
	{
		vec.push_back(word);
		cin >> word;
	}
	display_word(vec,5);  //呼叫函式
	system("pause");
	return 0;
}

void display_word(vector<string> myword,const int threshold)  //定義函式,第一個引數為容器名,第二個引數為閾值
{
	for(int i=0;i<myword.size();i++)  //遍歷容器類各個物件
	{
		if(myword[i].size() < threshold)  //如果單詞長度小於閾值
			cerr << "Error: " << endl  //輸出以下錯誤資訊
				 << __FILE__ << endl
				 << "at line " << __LINE__ << endl
				 << "compiled on " << __DATE__
				 << "at " << __TIME__ << endl
				 << "Word read was \" " << myword[i] << " \": Length too short" << endl;
		else
			cout << myword[i] << endl;  //否則輸出單詞
	}	
}

該程式首先定義了一個vector物件vec,然後由使用者自主輸入一些單詞,輸入完成以q結束。再呼叫自定義函式對輸入的單詞進行處理,為函式傳入容器物件和長度閾值,函式體做以下處理:將長度小於5的單詞作為輸入不符合要求的單詞,輸出錯誤資訊,長度大於等於5的單詞正常打印出來。

效果如下: