0

我有以下宏

#define FIRST(first) \
 switch(first, 0) default:

#define LAST(last) \
 switch(0) for(;0;last) default:

#define BRACKET(first, last) \
 switch(first, 0) for(;0;last) default:

它们是这样使用的。

#include <stdio.h>

// ... Macros are defined here

int main (int argc, const char * argv[])
{
    int x;

    FIRST(x = 4)
    {
        printf("%i\n", x);
    }

    LAST(++x)
    {
        printf("%i\n", x);
    }

    printf("%i\n", x);

    return 0;
}

BRACKET 只是 FIRST 和 LAST 的组合。不过,FIRST 宏(和 BRACKET 宏)还不够好。我希望能够编写以下代码,其中 y 的范围为花括号。

    FIRST(int y = 0)
    {
        printf("%i\n", y);
    }

如何使用 C 编程语言编写 FIRST 宏,让我声明一个作用域在花括号内的变量?

一些极端情况是:

我希望允许以下代码片段

FIRST(int x = 0)
 printf("%i\n", x);

我希望禁止使用以下代码片段

FIRST(int x = 0)
 printf("%i\n", x);

++x;
printf("%i\n", x);

PS 我很惊讶编译器接受了“switch(0) for(;0;last) default:”,这真的是合法的 C 代码吗?

4

1 回答 1

1

如果您有一个至少符合 C99 的编译器,那么以您想要的方式获取作用域变量是很容易的。(否则不要这样做,或者让自己成为一个现代编译器)。

块或语句的前缀FIRST(int y = 0)可以通过类似的东西来实现

for (int t = 0; t < 1; ++t)
  for(int y = 0; t < 1; ++t)

也就是说,您定义了一个辅助变量,该变量控制循环只执行一次。现代编译器很容易优化随之而来的噪音并达到本质。

小心你可以把它打包成一个宏,你应该注意这个名字也能捕捉到正在发生的事情,并且不要伤害你的程序员同事的眼睛。特别是在某处放置一个大的警告标签,这样的事情会改变breakcontinue语句的语义,这对于不知情的读者来说是相当令人惊讶的。

我已经用-scopes写了更多关于范围绑定资源管理的for文章。

于 2012-04-29T21:17:51.860 回答