[オリジナル]最も単純な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 " 、行、ファイル、nc_strerror(stat)); 
        exit(1 ); 
    } 
} int stat = fun(); 
check_err(stat、__LINE__、__FILE__);

   

 

また、C言語で使用できるマクロはどれですか。

 

標準C言語の前処理では、特定のオブジェクトマクロの定義が必要です。各定義済みマクロの名前は、1つまたは2つのアンダースコア文字で始まり、終了します。これらの定義済みマクロは、プログラマが未定義(#undef)にしたり、再定義したりすることはできません。次の定義済みマクロテーブルは私がコピーしたものです。
__LINE__ 10進整数定数で表された現在のプログラム行の行番号
__FILE__文字列定数を示す現在のソースファイル名
__DATE__変換されたカレンダー日付。Mmmdd yyyyの形式の文字列定数で表され、Mmmはasctimeによって生成されます。
__TIME__変換された時刻は、asctimeによって生成される「hh:mm:ss」の形式の文字列定数を表します。(Asctimeは関数を参照しているようです)
__
STDC__ 10進整数定数を実装する場合、エディターは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__には10進定数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();
}
結果:
2017年11月24日
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__」はすべて大文字と小文字が区別されます。

おすすめ

転載: www.cnblogs.com/lyggqm/p/12761356.html