c 变量对 main 不可见。使用 C 头文件

c variables not visible to main. using C header files

提问人:Lama RL 提问时间:11/12/2022 最后编辑:Vlad from MoscowLama RL 更新时间:11/12/2022 访问量:231

问:

我正在尝试在 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;在主功能内部。发生同样的错误 我在这里错过了什么,为什么变量对主要不可见?

C 标头 全局变量 按值传递

评论

0赞 Gerhardh 11/12/2022
void get_q (int a, int b, char* q)您正在对全局变量进行阴影处理。在该函数中,您无法访问它们。相反,您将始终访问本地参数。
0赞 Gerhardh 11/12/2022
您未在标头中定义任何变量。你声明它们。它们在 C 文件中定义。这没关系。通常,不应在标头中定义任何变量或函数。只有在极少数情况下,这才是一个好主意。

答:

0赞 Eric Postpischil 11/12/2022 #1

void get_q (int a, int b, char* q)声明将参数命名为 和 (和 )。这些是与外部 和 不同的变量,它们隐藏了外部 和 。如果要使用外部 和 ,则不得具有具有这些名称的参数。get_qabqabababget_q

(请注意,在程序中使用非常量外部变量通常是糟糕的设计,只有有限的例外。

0赞 Vlad from Moscow 11/12/2022 #2

函数get_q

void get_q (int a, int b, char* q){

处理变量值的副本,并在文件作用域中声明。ab

get_q(a, b, argv[1]);

因此,更改函数中的副本不会导致更改变量和 的原始值。ab

您可以声明该函数,例如

void get_q ( char* q){

并称它为

get_q(argv[1]);

但一般来说,定义依赖于全局变量的函数是一个坏主意。

您可以声明变量和 in,并将它们传递给需要通过引用通过指向它们的指针间接更改它们的函数。abmain

例如

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]