我有一个像这样的全局变量列表:
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;
}
我该如何解决?当我尝试在函数中声明这些变量时,整个程序将返回许多错误。
答案 0 :(得分:3)
不能将全局变量用作函数的参数。那也没有道理。
int multiplication (int a, int b)
实际上,这里发生的是a
和b
是函数multiplication
内部的两个单独的局部函数变量。
它们不是相同名称的全局变量的引用。
由于函数局部变量具有更高的优先级,因此它们会将全局变量隐藏在函数范围内,这意味着,如果在函数内部使用/地址a
或b
,它们将引用局部变量,而不是全局变量。
这就是诊断:
“ 声明在全局范围内隐藏了一个变量”
对你说。局部变量的声明遮盖了函数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
使用仅更改全局变量的功能被认为是不好的做法。
旁注:
您应尽可能避免使用全局变量,在全局变量中,可以按值或通过引用将值作为参数传递。
如果您有很多函数,则需要在其中将同一变量的值传递给它,以便使用全局变量。
您似乎也混淆了“参数”和“参数”这两个术语,请看这里: