函数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
是函数
乘法中两个独立的函数局部变量

它们不是具有相同名称的全局变量的引用

由于函数局部变量具有更高的优先级,它们在函数范围内隐藏全局变量,这意味着如果在函数内部使用/address
a
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
(这会把警告变成错误)。