0
#define SEND_VALUE(num, point1, point2, point3...) \
{ \
  char number[6]; \
  char p1[6];\
  char p2[6];\
  char p3[6];\
  if(num == ONE) {sprintf(number, "ONE");}\
  if(num == TWO) {sprintf(number, "TWO");}\
  if(num == THREE) {sprintf(number, "THREE");}\
  if(point1 == ONE) {sprintf(p1, "ONE");}\
  if(point1 == TWO) {sprintf(p1, "TWO");}\
  if(point1 == THREE) {sprintf(p1, "THREE");}\
  if(point2 == ONE) {sprintf(p2, "ONE");}\
  if(point2 == TWO) {sprintf(p2, "TWO");}\
  if(point2 == THREE) {sprintf(p2, "THREE");\
  if(point3 == ONE) {sprintf(p3, "ONE");}\
  if(point3 == TWO) {sprintf(p3, "TWO");}\
  if(point3 == THREE) {sprintf(p3, "THREE");\
  fprintf(fp,"%s:%s:%s:%s:\n",number, p1,p2,p3);\
  fflush(fp); \
  fprintf(fp,fmt,##__VA_ARGS__);\
  fflush(fp); \
  fprintf(fp,"\n");\
  fflush(fp); \
}

現在のところ、このマクロは可変長である必要はありません。しかし、将来の使用のために、可変長にしたいと思います。可変引数マクロの引数リストの書き方・定義方法と使い方がわかりません。上記の例のように、p1、p2 を設定して印刷する必要があります。

このマクロを次のように呼び出しています。

SEND_VALUE(ONE, ONE, ONE, ONE);

誰かがこれを可変的な方法で達成するのを手伝ってくれませんか?

4

1 に答える 1

1

fmtマクロパラメーターとしても取得すると仮定すると、マクロの大幅に短縮されたバージョンが次のようになります。

#define SEND_VALUE(num, point1, point2, point3, ...) \
do { \
  fprintf(fp,#num":"#point1":"#point2":"#point3":\n");\
  fflush(fp); \
  fprintf(fp,__VA_ARGS__);\
  fflush(fp); \
  fprintf(fp,"\n");\
  fflush(fp); \
} while(0)

フォーマットを明示したい場合は、次のこともできます。

#define SEND_VALUE(num, point1, point2, point3, fmt, ...) \
do { \
  fprintf(fp,#num":"#point1":"#point2":"#point3":\n");\
  fflush(fp); \
  fprintf(fp,fmt,##__VA_ARGS__);\
  fflush(fp); \
  fprintf(fp,"\n");\
  fflush(fp); \
} while(0)

,##__VA_ARGS__ただし、これは gcc 拡張であることに注意してください。

いくつかのメモ:

  • do { } while(0)コード ブロックに展開されるマクロをフールプルーフにするために使用します。if/ while/etc ブロックに単一のステートメントとして配置でき;、実行時のオーバーヘッドなしで受け入れることもできます。
  • #param値がパラメーター名である文字列を取得するために使用します。あなたの例SEND_VALUE(ONE, ONE, ONE, ONE)では、#numになります"ONE"
  • C"some"" string"では と同等"some string"です。
  • fpマクロにもパラメータとして渡すとよいでしょう。

編集:最終的に、マクロは次のように使用できます:

SEND_VALUE(ONE, ONE, ONE, ONE, "");
SEND_VALUE(ONE, TWO, ONE, THREE, "%d", 10);
SEND_VALUE(THREE, TWO, ONE, TWO, "format string! %s %s", "param1", "param2");
于 2014-01-27T10:50:45.223 に答える