C变量范围在struct中

时间:2009-04-30 13:33:41

标签: c struct

我最近在C面临三个不同的情况,我会帮助:

  1. 我的C代码有一个全局变量:

    int ref_buf; //declared in a header file
    

    在函数定义中,我使用与参数相同的名称:

    void fun(int ref_buf, param2, param3)
    {
    }
    

    它是否会覆盖最初定义的全局变量,是否会导致错误?

  2. 我可以在C数据结构中声明一个静态变量吗?:

    struct my
    {
        int a;
        static int b;
    };
    

    有用吗?是否存在需要它的具体情况?

  3. 我可以按如下方式初始化单个结构变量:

    struct my
    {
        int a;
        int b = 4;
    };
    

7 个答案:

答案 0 :(得分:7)

问题1

该函数中对ref_buf的所有引用都将绑定到参数而不是全局变量。

问题2

这在C中不合法,但在C ++中是合法的。 C中的关键字static只能用于文件范围变量或本地变量。

问题3

这在C(或C ++)中是不合法的。您需要创建一个工厂方法来处理这个问题。

my create_my() {
  my m;
  m.b = 4;
  return m;
}

答案 1 :(得分:4)

在第3季度:GCC允许您初始化这样的结构(根据C99标准的要求):

struct
{
    int a;
    int b;
} my = { .b = 4 };

GCC doc on designated initializers

答案 2 :(得分:2)

1a)本地和全局变量是独立的实体,因此本地变量不会覆盖全局变量。但是,在函数内部不能访问全局函数(参见下面的注释)。

1b)它实际上并不正确,但它确保引起混淆,并且混淆会导致错误,因此最好为每个错误使用不同的名称。

2)不,这不合法C.但是你可以使整个结构静止。

3)不。你这样做:

struct my
{
    int a;
    int b;
} = {0, 4};

注1:变量应在.c文件中声明,而不是.h文件。如果需要在多个文件中访问变量,请在头文件中添加extern声明。

注2:尽可能避免使用全局变量。

答案 3 :(得分:0)

问题1: 我认为在本地范围内声明的变量需要预先考虑,它不应该覆盖它,但是在声明变量的范围内,它将被替代使用。

假设它编译。<​​/ p>

答案 4 :(得分:0)

1)局部变量总是优先的,例如

int ref = 10;

void fun(int ref)
{
  printf("\n%d\n", ref);
}

int main()
{
 fun(252);
 return 0;
}

显示:252

Qs 2和3在C中不起作用。

答案 5 :(得分:0)

  1. 是的,它会在技术上覆盖,但是一个好的编译器会警告你这种情况,编译时会出现“warnings = errors”,所以这实际上不会编译。

  2. 不需要,因为“my”结构已经被声明为static,因此它被声明为整个结构。这为整个结构分配了内存,所以没有必要说“参与已经静态的结构并使其成为静态”。

  3. 不,不在定义中,但您可以在创建“实例”时使用:

    struct my MY =
    {
        {0, 4}
    };
    

答案 6 :(得分:0)

Q1:

不要在头文件中声明变量。如果将该头文件包含在两个源文件中并将源文件一起编译,则会遇到问题。也许你的链接器会让你离开他们,也许不是。

如果你真的需要全局变量,并且这种情况比典型的初学者想象的要少得多,那么在头文件中添加extern int ref_buf;之类的内容,在源文件中添加int ref_buf;。这意味着有一个ref_buf,所有其他源文件都能找到它。

函数参数本质上是一个具有相同名称的新变量,函数中的所有引用都将是它。您将无法从该函数中访问全局变量。该函数创建一个内部范围,在内部范围内声明的变量与外部范围中的变量不同。这可能会造成混淆,并且很容易创建错误,因此通常不鼓励使用相同名称和不同范围的变量。 (不同结构定义中的相同名称的变量通常不会混淆,因为您必须指定包含变量的结构。)

编译器将编译该函数,但好的编译器将发出警告消息。如果由于一个变量遮蔽另一个同名的变量而拒绝编译,那么它就不是真正的C编译器。