全局变量作为函数C中的参数

时间:2020-07-08 12:23:20

标签: c function declaration

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

var domainName = parse[0]

const stringIsIncluded = await page.evaluate((dName) => {
    console.log(dName);
 }, domainName);

这些变量用于设计用于对其计数的函数,例如:

int a, b, c, d;

现在我想使用'a'和例如“ b”作为我以这种方式声明的另一个函数的参数:

int my_func(string x)
{
 //count var a//
}

并定义这种方式:

int multiplication(int a, int b);

运行它时,出现以下错误:

int multiplication(int a, int b)
{
c = a * b;
return c;
}

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

1 个答案:

答案 0 :(得分:3)

不能将全局变量用作函数的参数。那也没有道理。

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标志引起的,该标志将警告显示为 erros -Werror很好,但是您应该能够区分实际错误(无论如何都不会编译代码的问题),并且仅警告仅显示为错误的警告,以防止代码执行任何可能导致< em>可以为您提供有关算法成功执行或执行的问题。

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


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

#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?