提问人:Lama RL 提问时间:11/12/2022 最后编辑:Vlad from MoscowLama RL 更新时间:11/12/2022 访问量:231
c 变量对 main 不可见。使用 C 头文件
c variables not visible to main. using C header files
问:
我正在尝试在 C 头文件中定义变量。然后在函数中处理这些变量,并在 main 函数中使用这些变量的新值。 代码如下所示: C 头 :
#ifndef _myheader_h
#define _myheader_h
extern int a;
extern int b;
void get_q (int, int, char*);
#endif
我的 C 源文件如下所示:
#include <stdlib.h>
#include <stdio.h>
#include "myheader.h"
#include <string.h>
int a;
int b;
void get_q (int a, int b, char* q){
if(strstr(q, "somestring1")!=NULL){
a=1;
b=0;
printf("a was chosen \n");
printf( " a= %i, b= %i \n", a, b);
return;
}else if (strstr(q, "somestring2")!=NULL){
printf("b was chosen \n");
a=0;
b=1;
return;
}else {
printf("please enter a valid q");
return;
}
}
int main (int argc, char **argv){
get_q(a, b, argv[1]);
printf( " a = %i , b = %i \n ", a, b);
if(a){
//some function
}else if (b){
// some function
}else {
printf("no valid q was given");
}
}
现在的问题是,当我输入“somestring1”时,输出是:
从函数get_q
选择了 A
a =1 , b=0
与美因相比
a=0,b=0
没有给出有效的 q
如果我声明 int a=0;整数 b=0;在主功能内部。发生同样的错误 我在这里错过了什么,为什么变量对主要不可见?
答:
0赞
Eric Postpischil
11/12/2022
#1
void get_q (int a, int b, char* q)
声明将参数命名为 和 (和 )。这些是与外部 和 不同的变量,它们隐藏了外部 和 。如果要使用外部 和 ,则不得具有具有这些名称的参数。get_q
a
b
q
a
b
a
b
a
b
get_q
(请注意,在程序中使用非常量外部变量通常是糟糕的设计,只有有限的例外。
0赞
Vlad from Moscow
11/12/2022
#2
函数get_q
void get_q (int a, int b, char* q){
处理变量值的副本,并在文件作用域中声明。a
b
get_q(a, b, argv[1]);
因此,更改函数中的副本不会导致更改变量和 的原始值。a
b
您可以声明该函数,例如
void get_q ( char* q){
并称它为
get_q(argv[1]);
但一般来说,定义依赖于全局变量的函数是一个坏主意。
您可以声明变量和 in,并将它们传递给需要通过引用通过指向它们的指针间接更改它们的函数。a
b
main
例如
void get_q (int *a, int *b, char* q){
if(strstr(q, "somestring1")!=NULL){
*a=1;
*b=0;
//...
int main (int argc, char **argv){
int a, b;
get_q( &a, &b, argv[1]);
//...
答:所以你需要检查这不是一个空指针。argv[1]
上一个:C 函数内部结构下数组的动态分配
评论
void get_q (int a, int b, char* q)
您正在对全局变量进行阴影处理。在该函数中,您无法访问它们。相反,您将始终访问本地参数。