【C進階】#error和#line使用分析

bryson發表於2021-12-26

Summary

1)#error用於生成一個編譯錯誤資訊;#warning用於生成一個編譯警告資訊;

2)編譯過程中的任何錯誤資訊意味著無法生成最終的可執行程式

3)語法:#error/#warning message,message不需要用雙引號包圍

4)#line用於指定後續程式碼的起始行號和檔名

5)語法:#line line filename filename可勝率,是個字串(雙引號)

·#error和#line分析

1、#error和#warning

#error用於生成一個編譯錯誤資訊;#warning用於生成一個編譯警告資訊;

#error是一種預編譯器指示字,可用於提示編譯條件是否滿足
注意:編譯過程中的任何錯誤資訊意味著無法生成最終的可執行程式
語法:#error message,message不需要用雙引號包圍

#ifndef __cplusplus
    #error This file should be processed with C++ compiler.
#endif

使用gcc編譯器編譯:gcc test.c
輸出:test.c 4: error: #error This file should be processed with C++ compiler.
不會生成可執行程式

使用g++編譯器編譯:g++ test.c
可以生成可執行程式

分析:__cplusplus是C++編譯器裡特有的巨集,
使用gcc時,無法識別這個巨集,
    因此輸出了一條錯誤資訊,並且由於存在錯誤資訊,可執行程式無法生成;
使用g++時,就會跳過該段預處理。
#ifndef __cplusplus
    #warning This file should be processed with C++ compiler.
#endif

使用gcc編譯器編譯:gcc test.c
輸出:test.c 4: warning: #warning This file should be processed with C++ compiler.
雖然提示了警告,但是會生成可執行程式

2、#line

#line 用於強制指定新的行號和編譯檔名,並對源程式的程式碼重新編號;本質重定義__LINE__和__FILE__。
用法:#line number filename (filename可省略)

#line 1 "delphi.c" : 指定當前宣告處的下一行為第1行,指定當前檔名為"delphi.c"

背景:最開始大家都把程式碼寫在一個檔案裡,比如3個開發同時完成了一個.c檔案,這時候出錯了就不好定位是誰寫的程式碼出問題了。所以就用#line這個預處理指示字,來指明每一段程式碼的行號和檔名。下次出問題報錯,就知道是誰的程式碼寫錯了。

本文總結自“狄泰軟體學院”唐佐林老師《C語言進階課程》。
如有錯漏之處,懇請指正。

相關文章