【问题标题】:Global variables as arguments in function C全局变量作为函数 C 中的参数
【发布时间】:2020-10-28 20:39:11
【问题描述】:

我有一个这样的全局变量列表:

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;
}

当我运行它时,我得到以下错误:

 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;

我该如何解决?当我尝试在函数中声明这些变量时,整个程序会返回很多错误。

【问题讨论】:

  • 你不能简单地使用不同的变量名吗?您可以重新允许变量隐藏,但通常更清楚的是不要对多个变量使用相同的名称。
  • 如果它们是全局的,为什么将它们作为参数传递......但是,你不应该使用全局变量,你根本不会有重复/隐藏变量名的问题.
  • 在函数中访问全局状态被认为是一个糟糕的设计选择,因为它使您的程序成为tightly coupled 的一部分。改变全局变量是一个更糟糕的设计选择。只要有可能,尽量使函数只通过参数传递所有相关数据。像multiplication 这样的数学函数绝对没有理由访问或改变全局状态。
  • 请注意,您的错误并不是真正的错误:这是您的编译器非常有用(保持原样)。如果您真的想按照自己的方式进行操作(坏主意),只需使用不同的编译器选项进行编译,特别是省略 -Werror(这会将警告变成错误)。

标签: c function declaration


【解决方案1】:

您不能将全局变量用作函数的参数。那也没有任何意义。

int multiplication (int a, int b) 

实际上,ab 是函数 multiplication 内部的两个独立的函数局部变量。

它们不是同名全局变量的引用。

由于函数局部变量具有更高的优先级,它们在函数范围内隐藏全局变量,这意味着如果您在函数内部使用/寻址ab,它们引用局部变量,而不是全局的。

这就是诊断:

"声明在全局范围内隐藏变量"

对你说。局部变量的声明隐藏了函数multiplication内部的全局变量声明。


可以做的是将全局变量作为按值的参数传递给函数multiplication

#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;
}

输出:

Product: 50

以这种方式仍然会发生阴影,但如果您添加特定的-Wno-shadow 标志以关闭阴影的警告/错误,则不会出现问题。这通常只是一个警告,提示您出现阴影。影子本身是无害的。

它被视为错误是由-Werror标志引起的,它将警告显示为错误-Werror 很棒,但是您应该能够区分真正的错误(无论如何都不会编译代码的问题)和仅显示为错误的警告,以防止代码被任何可能的合理事物执行 可以给你关于算法的成功实现或执行的问题。

或者只是将参数重命名为不同的名称,以使编译器不显示这些警告。


如果您只想在函数multiplication 内部使用全局变量,您可以在main() 内部使用c = a * b; 并省略整个函数multiplication 然后:

#include <stdio.h>

int a = 5, b = 10, c = 15, d = 20; 

int main (void)
{
    c = a * b;
    printf("Product: %d", c);
}

输出:

Product: 50

使用只改变全局变量的函数被认为是不好的做法。


旁注:

  • 您应该尽可能避免使用全局变量,因为您可以通过值或引用作为参数传递值。

    如果你有很多函数,你需要将同一个变量的值传递给它,那么使用全局变量是有意义的。

  • 此外,您似乎混淆了“参数”和“参数”这两个术语,请看这里:

    What's the difference between an argument and a parameter?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    相关资源
    最近更新 更多