函数C中作为参数的全局变量
我有一个全局变量列表,如下所示:函数C中作为参数的全局变量,c,function,declaration,C,Function,Declaration,我有一个全局变量列表,如下所示: int a, b, c, d; 这些变量用于计算它们的函数,如: int my_func(string x) { //count var a// } 现在我想使用'a'和例如'b'作为另一个函数的参数,我这样声明: int multiplication(int a, int b); int multiplication(int a, int b) { c = a * b; return c; } 并定义如下: int multiplication(in
int a, b, c, d;
这些变量用于计算它们的函数,如:
int my_func(string x)
{
//count var a//
}
现在我想使用'a'和例如'b'作为另一个函数的参数,我这样声明:
int multiplication(int a, int b);
int multiplication(int a, int b)
{
c = a * b;
return c;
}
并定义如下:
int multiplication(int a, int b);
int multiplication(int a, int b)
{
c = a * b;
return c;
}
当我运行它时,我得到以下错误:
ac.c:75:27: error: declaration shadows a variable in the global scope [-Werror,-Wshadow]
int multiplication(int a, int b)
^
ac.c:7:41: note: previous declaration is here
int a, b, c, d;
我怎样才能修好它?当我试图在函数中声明这些变量时,整个程序返回许多错误。不能将全局变量用作函数的参数。这也毫无意义
int multiplication (int a, int b)
实际上,这里发生的是a
和b
是函数乘法中两个独立的函数局部变量
它们不是具有相同名称的全局变量的引用
由于函数局部变量具有更高的优先级,它们在函数范围内隐藏全局变量,这意味着如果在函数内部使用/addressa
或b
,则它们指的是局部变量,而不是全局变量
这就是诊断的目的:
“声明在全局范围内隐藏变量”
对你说。局部变量的声明隐藏了函数乘法
中的全局变量声明
您可以做的是将全局变量作为参数按值传递给函数乘法
:
#include <stdio.h>
int multiplication (int a, int b);
int a = 5, b = 10, c = 15, d = 20;
int main (void)
{
printf("Product: %d", multiplication(a,b)); // arguments, global variables.
}
int multiplication (int a, int b) // parameters, local variables.
{
return a * b;
}
这样,阴影仍会出现,但如果添加特定的-Wno shadow
标志以关闭阴影警告/错误,则不会出现问题。这通常只是一个警告,提示您发生阴影。阴影本身是无害的
将其视为错误是由-Werror
标志引起的,该标志将警告显示为错误<代码>-Werror
很好,但是您应该能够区分真正的错误(无论如何都无法编译代码的问题)并且只显示为错误的警告,以防止代码使用任何合理的东西执行,这些合理的东西可能会给算法的成功实现或执行带来问题
或者将参数重命名为其他名称,使编译器不显示这些警告
如果您只想在函数
乘法
中使用全局变量,您可以使用c=a*b
在main()
的内部,省略整个函数乘法
,然后:
#include <stdio.h>
int a = 5, b = 10, c = 15, d = 20;
int main (void)
{
c = a * b;
printf("Product: %d", c);
}
使用只更改全局变量的函数被认为是不好的做法
旁注:
- 您应该尽可能避免使用全局变量,因为您可以通过值或引用作为参数传递值 如果有很多函数,需要将同一个变量的值传递给它,那么使用全局变量是有意义的
- 另外,由于您似乎混淆了“参数”和“参数”这两个术语,请看这里:
乘法
这样的数学函数绝对没有理由访问或改变全局状态。请注意,您的错误并不是一个真正的错误:这是因为您的编译器非常有用(保持原样)。如果你真的想按你的方式去做(坏主意),只需使用不同的编译器选项来编译,特别是省略-Werror
(这会把警告变成错误)。