【问题标题】:How can a static variable from other file accessed here on the C program below?如何在下面的 C 程序中访问来自其他文件的静态变量?
【发布时间】:2021-01-30 05:07:32
【问题描述】:
#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 关键字不应该允许从其他文件访问该变量,对吗?我有点糊涂了。

【问题讨论】:

  • C 和 C++ 是两种不同的语言。请删除多余的标签。
  • 我没有看到您直接从mainfunction 访问bvalue 可以直接访问它,并且在 printf 中调用时返回 b 的值
  • @jkb :它不应该被打印出来吗??那是我很困惑
  • static 只是意味着不能从其他源文件直接通过名称访问该变量。通过调用可以直接访问它的函数来间接“访问”它并没有错。这样的函数甚至可以返回一个指向静态变量的指针,然后调用者可以使用该指针直接访问该变量(但通过指针,而不是通过名称b)。
  • 不应将其视为安全功能,就好像编译器会保护变量免受外部代码的所有可能干扰一样。这主要是一种减少全局命名空间混乱的方法。

标签: c linker-errors external static-linking


【解决方案1】:

此声明

static int b=20;

意味着变量b 将仅在其翻译单元中可见,即在您定义它的file1.c 中。

在应该在不同文件中的main() 中,您只声明了b,但没有使用它。尝试使用它会发现链接器会失败,因为它找不到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;
}

尝试用以上修改编译你的程序,你会看到链接器会抛出错误。

有了上面提到的main()的变化,只需从file1.c文件中的变量b定义中删除static关键字,以上程序将成功链接,因为b将是一个具有外部链接的全局变量.

value() 你返回的 变量b 持有这与bstatic 还是non 无关-静态.

静态变量的生命周期是程序的整个运行过程。如果您有该静态变量的地址,则可以在其范围/翻译单元之外访问该静态变量。检查这个:

文件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

【讨论】:

  • 感谢 H.S.所以只能从其他文件访问公共变量??我们可以访问函数内部的变量吗??
  • @Meganathan C 中没有任何公共变量的概念。看起来您在 CC++ 之间感到困惑。记住一件事,CC++ 是两种不同的语言。深入了解C 中的存储类,熟悉C 中变量的作用域、生命周期和外部/内部链接,并通过此post
【解决方案2】:

那里并没有真正访问,编译时您会看到以下警告:

warning: type defaults to ‘int’ in declaration of ‘b’ [-Wimplicit-int]

您所做的只是打印函数 value 的返回值。

如果你真的想看看它是否被访问,检查如下:

评论您的printf("b = %d\n",value()); 并使用printf("b = %d\n",b);
在它的位置,然后编译和检查。

【讨论】:

  • 感谢爱尔兰。所以只能从其他文件访问公共变量??我们可以访问函数内部的变量吗??
  • @Meganathan,不清楚你在问什么,C(至少我知道)中没有公共变量的概念,最好打开一个如果您仍有疑问,请提供一些示例的新问题
猜你喜欢
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-12
  • 2023-03-19
  • 1970-01-01
  • 2021-02-25
相关资源
最近更新 更多