0

为什么我的 normals_since 函数看不到我的全局变量跳跃?我不敢相信在 main 中声明的变量在整个程序中不可用是什么封装或隐藏或什么意思?它是否可以通过诸如 main.z 或 _ main _z 之类的秘密方式访问?我的 gcc 错误>>

yrs_since.c: In function ‘normals_since’:
yrs_since.c:40:9: error: ‘leaps’ undeclared (first use in this function)
yrs_since.c:40:9: note: each undeclared identifier is reported only once </p>
for each function it appears in

possible answer
looks like if I want all functions to see the vars, I have to move 
int z; //place holder
int leaps;
int normals;

在 main 之外并在 #defines 之后将它们声明在顶部

#include stdio.h>
#include stdlib.h>
#define START_GREG 1582
int yrs_since(int year); //type-declare the function
int leaps_since(int years);
int normals_since(int years);

int main(int argc, char* argv[]){
    int year = 1599; //local var
    int z; //place holder
    int leaps;
    int normals;
    z = yrs_since(year); //call the function
    leaps = leaps_since(z); //leap years move the doomsday fwd by 2 days
    normals= normals_since(z); //normal years it adjusts one day
    printf("blah blah %d,", z);//print the result
    printf("leap years since 1582:-->> %d  <<", leaps);
    printf("normal years since 1582:-->> %d  <<", normals);
    return EXIT_SUCCESS;
}
int yrs_since(year){
    int x;
    x=year-START_GREG;
    return x;
};
int leaps_since (years){
    return years/4;
};

int normals_since(years){
    int x;
    x=years-leaps;
    return x;
};
4

5 回答 5

3

对,正如您所发现的,函数内部的变量仅对该函数可见。main是一个函数,就像任何其他函数一样,它没有以任何特殊方式处理。

全局变量在函数之外声明(但通常最好避免使用全局函数。

如果要避免使用全局变量,解决方案是将变量从 main 传递到使用该变量的函数中。

例如:

int normals_since(int years, int leaps){
    int x;
    x=years-leaps;
    return x;
};

请注意,我在 years 变量中添加了“int”。虽然在某些编译器中仍然允许使用旧式 C,但绝对建议使用 ANSI 标准(添加-ansi -strict -Wall -std=c99到您的 gcc 命令行中,为您提供“您可能做错的事情”的警告以及不遵循 ANSI 标准的错误)

于 2012-12-27T13:32:41.427 回答
2

在中声明的变量对其自身main()可见。您要么需要将这些变量移动到全局范围(在所有函数之外),要么将指向它们的指针传递给其他函数。main()

于 2012-12-27T13:30:38.933 回答
1

因为您已经在函数体内定义了跳跃main()。如果您希望它真正是全局的,请在main()函数外部定义它,例如,在原型的正下方:

int normals_since(int years);
于 2012-12-27T13:32:26.057 回答
0

可能的答案:看起来如果我想让所有函数都看到变量,我必须移动

int z; //place holder
int leaps;
int normals;

在 main 之外并在#defines.

于 2012-12-27T13:29:37.963 回答
0

在块内声明的任何var内容都不会在块外定义。
没有什么好相信的,它就是它的工作方式(在其他编程语言中也是如此)。
如果你想要一个全局var- 在所有块之外声明它。

于 2012-12-27T13:31:10.513 回答