如何在下面的 C 程序中访问其他文件中的静态变量?
How can a static variable from other file accessed here on the C program below?
#include <stdio.h>
#include <stdlib.h>
int function(int);
int main()
{
int a=1;
extern b;//can be only declared
printf("a=%d\n",function(a));
printf("b=%d\n",value());
return 0;
}
int function(int v)
{
return v+1;
}
在file1.c
中:
static int b=20;
int value() //can't be used on a static function
{
return b;
}
在上面的代码中,虽然我将变量 b
设为 static
,但它可以从其他文件访问。如何访问它,因为 static
关键字不应该允许从其他文件访问变量?我有点困惑。
此声明
static int b=20;
表示变量 b
仅在其翻译单元中可见,即在您定义它的 file1.c
中。
在本应在不同文件中的 main()
中,您只声明了 b
而未使用它。尝试使用它,你会发现 linker 会失败,因为它不会找到 b
.
的定义
int main()
{
int a=1;
extern int b; // note the type int in declaration. You have missed it.
printf("access b = %d\n", b); // <==== this won't work
return 0;
}
尝试使用上述更改编译您的程序,您会发现 linker 会抛出错误。
根据 main()
中的上述更改,只需从 file1.c
文件中的变量 b
定义中删除 static
关键字,上述程序将 link 成功因为那时 b
将是一个具有外部 linkage.
的全局变量
从 value()
你返回变量 b
持有的 值 这与 b
是否是 静态或非静态.
静态变量的生命周期是程序的整个运行。如果您有该静态变量的地址,则可以在其 scope/translation 单元之外访问该静态变量。检查这个:
文件 file1.c
:
#include <stdio.h>
static int b = 20;
int * retaddr_b (void) {
return &b;
}
void print_b (void) {
printf ("b = %d\n", b);
}
文件main.c
:
int * retaddr_b (void);
void print_b (void);
int main(void)
{
print_b(); // print static variable b value
int * ptr_b = retaddr_b(); // ptr_b pointing to b
*ptr_b = 99; // dereference ptr_b and assign different value
print_b(); // print static variable b value
return 0;
}
输出:
b = 20
b = 99
那里并没有真正访问它,除非你在编译时看到以下警告:
warning: type defaults to ‘int’ in declaration of ‘b’ [-Wimplicit-int]
您所做的只是打印函数 value
中的 return 值。
如果你真的想看看它是否被访问,请检查如下:
评论你的printf("b = %d\n",value());
并使用printf("b = %d\n",b);
在它的位置然后编译和检查。
#include <stdio.h>
#include <stdlib.h>
int function(int);
int main()
{
int a=1;
extern b;//can be only declared
printf("a=%d\n",function(a));
printf("b=%d\n",value());
return 0;
}
int function(int v)
{
return v+1;
}
在file1.c
中:
static int b=20;
int value() //can't be used on a static function
{
return b;
}
在上面的代码中,虽然我将变量 b
设为 static
,但它可以从其他文件访问。如何访问它,因为 static
关键字不应该允许从其他文件访问变量?我有点困惑。
此声明
static int b=20;
表示变量 b
仅在其翻译单元中可见,即在您定义它的 file1.c
中。
在本应在不同文件中的 main()
中,您只声明了 b
而未使用它。尝试使用它,你会发现 linker 会失败,因为它不会找到 b
.
int main()
{
int a=1;
extern int b; // note the type int in declaration. You have missed it.
printf("access b = %d\n", b); // <==== this won't work
return 0;
}
尝试使用上述更改编译您的程序,您会发现 linker 会抛出错误。
根据 main()
中的上述更改,只需从 file1.c
文件中的变量 b
定义中删除 static
关键字,上述程序将 link 成功因为那时 b
将是一个具有外部 linkage.
从 value()
你返回变量 b
持有的 值 这与 b
是否是 静态或非静态.
静态变量的生命周期是程序的整个运行。如果您有该静态变量的地址,则可以在其 scope/translation 单元之外访问该静态变量。检查这个:
文件 file1.c
:
#include <stdio.h>
static int b = 20;
int * retaddr_b (void) {
return &b;
}
void print_b (void) {
printf ("b = %d\n", b);
}
文件main.c
:
int * retaddr_b (void);
void print_b (void);
int main(void)
{
print_b(); // print static variable b value
int * ptr_b = retaddr_b(); // ptr_b pointing to b
*ptr_b = 99; // dereference ptr_b and assign different value
print_b(); // print static variable b value
return 0;
}
输出:
b = 20
b = 99
那里并没有真正访问它,除非你在编译时看到以下警告:
warning: type defaults to ‘int’ in declaration of ‘b’ [-Wimplicit-int]
您所做的只是打印函数 value
中的 return 值。
如果你真的想看看它是否被访问,请检查如下:
评论你的printf("b = %d\n",value());
并使用printf("b = %d\n",b);
在它的位置然后编译和检查。