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

不,你不能这样做。“code”的值是在运行时定义的,而宏在编译时被替换。您必须使用不同的宏定义。

于 2011-07-20T10:55:36.087 回答
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 回答
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 回答
-1

你可以这样做:

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

#define TRIPLE_LOOP()\
SOME_OTHER_CODE

我认为它会起作用:)

于 2011-07-20T10:53:01.653 回答