2

私はwin32アプリをLinuxに移植していて、すべての_snprintf_sの周りにたくさんの#ifdefを置く代わりに、どういうわけかそれをsnprintfに#defineする方法があるかどうか疑問に思いました。

だから-のようなもの

#define _snprintf_s(1,2,3,4,5) snprintf(1,2,4,5)

3番目のパラメーターである保存する最大文字数または_TRUNCATEは、snprintfには存在しません。

このアプローチは正しいですか?そのような#defineを実行できますか?もしそうなら、誰かが私がそれについてどうすべきかを指摘することができますか?

私はこの質問に答えて、そのような#definesに注意する必要があることを知りました。

ありがとう!

4

2 に答える 2

5

マクロの代わりに、関数として実装でき_snprintf_s()ます。この単純な(テストされていない)バージョンは、実行する_snprintf_s()はずのランタイムエラー処理を実行しません(必要に応じて追加できます)が、countパラメーターが課す違いと切り捨ての戻り値を処理しようとします。

#include <assert.h>
#include <stdarg.h>
#include <stdio.h>
#include <string.h>

#if !defined(_TRUNCATE)
#define _TRUNCATE ((size_t)-1)
#endif

int _snprintf_s(
   char *buffer,
   size_t sizeOfBuffer,
   size_t count,
   const char *format,
   ... 
)
{
    int retval;
    va_list ap;

    if ((count != _TRUNCATE) && (count < sizeOfBuffer)) {
        sizeOfBuffer = count;
    }

    va_start(ap, format);
    retval = vsnprintf(buffer, sizeOfBuffer, format, ap);
    va_end(ap);

    if ((0 <= retval) && (sizeOfBuffer <= (size_t) retval)) {
        retval = -1;
    }

    return retval;
}

(そもそもパラメータリストにcountパラメータがあるのはなぜですか?)_snprintf_s()

于 2012-09-14T20:48:52.077 に答える
5

#define _snprintf_s(a,b,c,...) snprintf(a,b,__VA_ARGS__)

于 2012-09-14T18:55:04.443 に答える