トップページ > 記事閲覧
マクロで可変長変数を使いたい
名前:にこよん 日時: 2018/03/28 15:57

こんにちわ 何度も連投すみません(-_-;) タイトルの通りなのですが、マクロで可変長変数を使う方法を調べて書いても、 コンパイルは通るのですが%dとかに入る数がおかしくなってしまいます 何か書き方を間違えているのでしょうか? もし原因がここだけで分かれば、ご教授願いますm(__)m #define ERR(str, ...) ErrorLog(str, _T(__FUNCTION__), __LINE__, __VA_ARGS__) //エラー時のマクロ //エラー情報をファイルに書き出す void ErrorLog(const char *errorMessage, LPCTSTR lpszFuncName, int lineN, ...);
メンテ

Page: 1 |

Re: マクロで可変長変数を使いたい ( No.1 )
名前:管理人 日時:2018/03/28 23:53

ErrorLog がどのような実装になっているか分かりませんが、にこよんさんが書かれた定義のままの マクロと関数で問題なく可変長引数の関数を実装できましたので、よろしければごらんください エラー情報をファイルに書き出す関数ではなく、文字列を画面に描画する関数となっていますが・・・ #include "DxLib.h" #include <varargs.h> #define ERR(str, ...) ErrorLog(str, _T(__FUNCTION__), __LINE__, __VA_ARGS__) //エラー時のマクロ void ErrorLog(const char *errorMessage, LPCTSTR lpszFuncName, int lineN, ...) { int Result ; va_list VaList ; char String[ 2048 ] ; va_start( VaList, lineN ) ; vsprintf( String, errorMessage, VaList ) ; DrawString( 0, 0, String, GetColor( 255,255,255 ) ) ; va_end( VaList ) ; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode( TRUE ) ; if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } SetDrawScreen( DX_SCREEN_BACK ) ; int Counter = 0 ; while( ProcessMessage() == 0 ) { ClearDrawScreen() ; ERR( "エラーカウンター:%d", Counter ) ; Counter ++ ; ScreenFlip() ; } DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 }
メンテ
Re: マクロで可変長変数を使いたい ( No.2 )
名前:にこよん 日時:2018/03/29 00:20

サンプルコードありがとうございますm(__)m __VA_ARGS__が、紫色にならず白いままだったので、これが原因だと思ってしまっていました va_startの関数の使い方を取り違えていたのが原因のようで va_start( VaList, errorMessage) ; と、書いてしまっていました サンプル通りに修正することで正常に動きました ありがとうございます 下のインクルードは何のための物なのでしょうか? 私はインクルールドしておらず、してないままでも正常に動きました #include <varargs.h>
メンテ
Re: マクロで可変長変数を使いたい ( No.3 )
名前:管理人 日時:2018/03/29 00:38

#include <varargs.h> は va_start や va_end などを使用するために必要なヘッダファイルを インクルードしている記述です( varargs.h の代わりに stdarg.h でもOKです ) 確かにこの記述が無くてもコンパイルが成功しますね・・・ どこかのファイルで既にインクルードしているのかもしれません・・・
メンテ
Re: マクロで可変長変数を使いたい ( No.4 )
名前:にこよん (解決) 日時:2018/03/29 08:45

なるほどです 色々ありがとうございましたm(__)m
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存