我最近在C
面临三个不同的情况,我会帮助:
我的C
代码有一个全局变量:
int ref_buf; //declared in a header file
在函数定义中,我使用与参数相同的名称:
void fun(int ref_buf, param2, param3)
{
}
它是否会覆盖最初定义的全局变量,是否会导致错误?
我可以在C
数据结构中声明一个静态变量吗?:
struct my
{
int a;
static int b;
};
有用吗?是否存在需要它的具体情况?
我可以按如下方式初始化单个结构变量:
struct my
{
int a;
int b = 4;
};
答案 0 :(得分:7)
该函数中对ref_buf的所有引用都将绑定到参数而不是全局变量。
这在C中不合法,但在C ++中是合法的。 C中的关键字static只能用于文件范围变量或本地变量。
这在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 };
答案 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)
是的,它会在技术上覆盖,但是一个好的编译器会警告你这种情况,编译时会出现“warnings = errors”,所以这实际上不会编译。
不需要,因为“my”结构已经被声明为static,因此它被声明为整个结构。这为整个结构分配了内存,所以没有必要说“参与已经静态的结构并使其成为静态”。
不,不在定义中,但您可以在创建“实例”时使用:
struct my MY =
{
{0, 4}
};
答案 6 :(得分:0)
Q1:
不要在头文件中声明变量。如果将该头文件包含在两个源文件中并将源文件一起编译,则会遇到问题。也许你的链接器会让你离开他们,也许不是。
如果你真的需要全局变量,并且这种情况比典型的初学者想象的要少得多,那么在头文件中添加extern int ref_buf;
之类的内容,在源文件中添加int ref_buf;
。这意味着有一个ref_buf
,所有其他源文件都能找到它。
函数参数本质上是一个具有相同名称的新变量,函数中的所有引用都将是它。您将无法从该函数中访问全局变量。该函数创建一个内部范围,在内部范围内声明的变量与外部范围中的变量不同。这可能会造成混淆,并且很容易创建错误,因此通常不鼓励使用相同名称和不同范围的变量。 (不同结构定义中的相同名称的变量通常不会混淆,因为您必须指定包含变量的结构。)
编译器将编译该函数,但好的编译器将发出警告消息。如果由于一个变量遮蔽另一个同名的变量而拒绝编译,那么它就不是真正的C编译器。