0
4

2 回答 2

4

您无法从另一段代码中获取该结构,因为您已在大括号块中声明它。C 范围规则禁止访问该块之外的代码。即使您让宏生成正确的名称也是如此:__counter_info_F 而不是 __counter_info_FOO。

顺便说一句,这不是#define 问题。当 C 看到代码时,所有宏处理都完成了,编译器只看到预处理器生成的标记。

找到一种在没有宏的情况下完成工作的方法......然后找出一个宏表示来简化编码。

一种方法是使用不使用 do 循环的宏来密封这些变量。现在的问题是生成唯一的名称。仔细查看这些宏,您会发现这是创建一次性循环来解决的问题……重复名称创建双重定义。如果您打开宏生成的代码,您将不得不以另一种方式解决重复名称问题......可能通过添加宏参数。

有一件事,记录在案:你不需要像 do 或 for 这样的复合语句来包含一个普通的块。只需用大括号括起来就足够了。你可以去掉开头的“do”和“while(0);” 最后,并获得相同的效果。

于 2013-09-04T23:47:43.987 回答
0

如果结构在函数中声明为静态,则其可见性将仅限于该函数。示例(没有宏):

struct hoppa {
        int i;
        };

void start(void)
{
static struct hoppa one = {1};
}

void use_it(void)
{
one.i = 2; //FAIL
}
于 2013-09-04T23:46:19.660 回答