2

私がやりたいことは、このようなものです

#define TRIPLE_LOOP(code)\
//if there is something in code \
for(...) for(...) for(...) { code }\
//if code is empty then\
SOME_OTHER_CODE

となることによって

TRIPLE_LOOP(printf("muhahaha"))

出力のトリプルループ内にprintfを生成し、

TRIPLE_LOOP()

SOME_OTHER_CODE が生成されます これは可能ですか?

4

5 に答える 5

2

これは私にとってほとんどうまくいきます:)

#include <stdio.h>

#define NARGS2(_1, N, ...) N
#define NARGS(...) NARGS2(__VA_ARGS__, 1, 0)
#define TRIPLELOOP(...)                         \
      do {                                      \
        if (NARGS(__VA_ARGS__)) {               \
          int i, j, k;                          \
          for (i=0; i<2; i++) {                 \
            for (j=0; j<2; j++) {               \
              for (k=0; k<2; k++) {             \
                __VA_ARGS__;                    \
              }                                 \
            }                                   \
          }                                     \
        } else {                                \
          printf("NO ARGS");                    \
        }                                       \
      } while (0)

int main(void) {
  TRIPLELOOP(printf("haha"); puts("!"));
  TRIPLELOOP();
}

ideoneでも動作します。

于 2011-07-20T11:12:57.470 に答える
1

いいえ、これはできません。「コード」の値は実行時に定義され、マクロはコンパイル時に置き換えられます。異なるマクロ定義を使用する必要があります。

于 2011-07-20T10:55:36.087 に答える
0

コンパイラが gcc または MSVC の場合、次のコードが目的を満たしている可能性があります。

#define EXPAND( x ) x /* for MSVC */
#define CONCAT_( x, y ) x ## y
#define CONCAT( x, y ) CONCAT_( x, y )
#define CAR_( x, ... ) x
#define CAR(...) EXPAND( CAR_( __VA_ARGS__ ) )
#define VA_ARGS_(...) , ##__VA_ARGS__
#define VA_ARGS(...) VA_ARGS_( __VA_ARGS__ )
#define IS_EMPTY(...) CAR( VA_ARGS( __VA_ARGS__ ) 1 )

#define TRIPLE_LOOP(...) \
  CONCAT( TRIPLE_LOOP_, IS_EMPTY(__VA_ARGS__) )(__VA_ARGS__)
#define TRIPLE_LOOP_1(...) SOME_OTHER_CODE
#define TRIPLE_LOOP_(...) for(...) for(...) for(...) { __VA_ARGS__; }

TRIPLE_LOOP_1引数が空の場合にTRIPLE_LOOP_ 対応し、それ以外の場合に対応します。これはideoneのテストです。

于 2011-07-20T12:02:45.187 に答える
0

マクロは一度しか定義できないため、実際にはそれを行うことはできません。それを達成するためにいくつかのトリックを使用できます:

#define TRIPLE_LOOP(CONDITION, ...)\
if(CONDITION) {\
for(...) for(...) for(...) { __VA_ARGS__; }\
} \
else {\
SOME_OTHER_CODE \
}

使用法:

TRIPLE_LOOP(true, printf("muhahaha"));  // `true` can be 1
TRIPLE_LOOP(false);  // `false` can be 0

ただし、引数を渡すときは常に適切なbool変数true/を渡すようにしてください。false

于 2011-07-20T11:04:32.237 に答える
-1

あなたはこれを行うことができます:

#define TRIPLE_LOOP(code)\
for(...) for(...) for(...) { code }\

#define TRIPLE_LOOP()\
SOME_OTHER_CODE

そして、私はそれがうまくいくと思います:)

于 2011-07-20T10:53:01.653 に答える