[原]最簡單的c語言,出錯輸出,日志打印 以及 C預定義的宏


檢查一個函數調用是否出錯,主要是看返回值,因此對返回值進行有效檢查就可以:

#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__" 都是大小寫敏感的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM