我有以下宏
#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);
P.S。我很惊讶“switch(0)for(; 0; last)default:”被编译器接受,这真的是合法的C代码吗?
答案 0 :(得分:1)
如果您的编译器至少符合C99,那么以您希望的方式获取范围变量很容易。 (否则不要这样做,或者让自己成为现代编译器)。
像FIRST(int y = 0)
这样的块或语句的前缀可以通过
for (int t = 0; t < 1; ++t)
for(int y = 0; t < 1; ++t)
即你定义一个辅助变量来控制循环只执行一次。现代编译器可以轻松优化随之而来的噪音,并且必不可少。
小心翼翼地将它打包成一个宏,你应该注意这个名字也能捕捉到正在发生的事情并且你不会伤害你的程序员。特别是在某个地方放置一个大警告标签,这些事情会将break
和continue
语句的语义更改为对于不知情的读者来说非常令人惊讶的事情。