檢查一個函數調用是否出錯,主要是看返回值,因此對返回值進行有效檢查就可以:
#define NO_ERR 0 void check_err(const int stat, const int line, const char *file) { if (stat != NO_ERR) { (void)fprintf(stderr, "line %d of %s: %s\n", line, file, nc_strerror(stat)); exit(1); } } int stat = fun(); check_err(stat, __LINE__, __FILE__);
另外介紹下,哪些是c語言可以使用的宏
標准C語言預處理要求定義某些對象宏,每個預定義宏的名稱一兩個下划線字符開頭和結尾,這些預定義宏不能被取消定義(#undef)或由編程人員重新定義。下面預定義宏表,被我抄了下來。
__LINE__ 當前程序行的行號,表示為十進制整型常量
__FILE__ 當前源文件名,表示字符串型常量
__DATE__轉換的日歷日期,表示為Mmm dd yyyy 形式的字符串常量,Mmm是由asctime產生的。
__TIME__ 轉換的時間,表示"hh:mm:ss"形式的字符串型常量,是有asctime產生的。(asctime貌似是指的一個函數)
__STDC__ 編輯器為ISO兼容實現時位十進制整型常量
__STDC_VERSION__ 如何實現復合C89整部1,則這個宏的值為19940SL;如果實現符合C99,則這個宏的值為199901L;否則數值是未定義
__STDC_EOBTED__ (C99)實現為宿主實現時為1,實現為獨立實現為0
__STDC_IEC_559__ (C99)浮點數實現復合IBC 60559標准時定義為1,否者數值是未定義
__STDC_IEC_559_COMPLEX__ (C99)復數運算實現復合IBC 60559標准時定義為1,否者數值是未定義
__STDC_ISO_10646__ (C99)定義為長整型常量,yyyymmL表示wchar_t值復合ISO 10646標准及其指定年月的修訂補充,否則數值未定義
C++中還定義了 __cplusplus
C語言中的__FILE__、__LINE__和__DATE__等都在頭文件#include<stdio.h>中
如果編譯器不是標准的,則可能僅支持以上宏名中的幾個,或根本不支持。記住編譯程序也許還提供其它預定義的宏名。
__LINE__ 及 __FILE__ 宏指示,#line指令可以改變它的值,簡單的講,編譯時,它們包含程序的當前行數和文件名。
__STDC__ 宏指令的意義是編譯時定義的。一般來講,如果__STDC__已經定義,編譯器將僅接受不包含任何非標准擴展的標准C/C++代碼。如果實現是標准的,則宏__STDC__含有十進制常量1。如果它含有任何其它數,則實現是非標准的。
__cplusplus 與標准c++一致的編譯器把它定義為一個包含至少6為的數值。與標准c++不一致的編譯器將使用具有5位或更少的數值。
常用宏的具體例子如下:
C語言中的__LINE__用以指示本行語句在源文件中的位置信息,舉例如下:
#include <stdio.h>
main()
{
printf("%d\n",__LINE__);
printf("%d\n",__LINE__);
printf("%d\n",__LINE__);
};
該程序在linux用gcc編譯,在windows的VS2013下編譯都可以通過,執行結果都為:
7
8
9
還可以通過語句#line來重新設定__LINE__的值,舉例如下:
#include <stdio.h>
#line 200 //指定下一行的__LINE__為200
main()
{
printf("%d\n",__LINE__);
printf("%d\n",__LINE__);
printf("%d\n",__LINE__);
};
編譯執行后輸出結果為:
202
203
204
C語言中的__FILE__用以指示本行語句所在源文件的文件。
例如:
#include <stdio.h>
int main()
{
printf("%s\n",__FILE__);
}
在gcc編譯生成a.out,執行后輸出結果為:
test.c
在windows的VS2013下編譯執行結果為:
d:\work\c&c++\project\project1\project1\main.cpp
--------------------------------------------------------------------------------------------------------------------------------------------------
C語言中__DATE__和__TIME__表示時間和日期
#include<stdio.h>
void main(void)
{
printf("%s\n",__DATE__);
printf("%s\n",__TIME__);
getch();
}
結果:
Nov 24 2017
21:15:27
__STDC__是預定義宏。當它被定義后,編譯器將按照ansic標准來編譯你的c程序。
__cplusplus用來定義是否是C++編譯器
#include <stdio.h>
int main(void)
{
#ifdef _cplusplus
printf("C++\n");
#endif
#ifdef __STDC__
printf("C\n");
#endif
return 0;
}
輸出結果為:
C
但是如果在前面定義_cplusplus
#include <stdio.h>
#define _cplusplus
int main(void)
{
#ifdef _cplusplus
printf("C++\n");
#endif
#ifdef __STDC__
printf("C\n");
#endif
return 0;
}
那么輸出就是:
C++
C
另外gcc還支持__func__,和__FUNCTION__,它指示所在的函數,但是這個關鍵字不被windows下的vc6.0支持,舉例如下
#include <stdio.h>
void main(void)
{
printf("%s\n",__FUNCTION__);
printf("%s\n",__func__);
}
其編譯后輸出結果為
main
main
注意: “#line”、 “__LINE__”、 “__FILE__" 及 “__func__" 都是大小寫敏感的。
