【问题标题】:Extern code not working外部代码不起作用
【发布时间】:2012-10-21 14:48:49
【问题描述】:

为什么下面的代码不起作用?请解释一下。

#include<stdio.h>
#include<stdlib.h>

int main(int number, char arg[])
{
    extern int i;
    i = 5;
    printf("%d",i);
    return 0;
}

#include<stdio.h>
#include<stdlib.h>

int main(int number, char arg[])
{
    extern int i;
    i = (int) malloc(sizeof(int));
    i = 5;
    printf("%d",i);
    return 0;
}

【问题讨论】:

  • 你需要说出你不工作的意思。链接错误?你在哪里定义i?
  • extern int i; 告诉编译器 i 存在别处。因为,你没有在任何地方定义它,它会抱怨。
  • 顺便提一下,main() 的参数是int argc, char *argv[]。如果您开始在程序中访问arg,您可能会感到惊讶。

标签: c extern


【解决方案1】:

extern 用于指定变量存在,但尚未定义。您不创建变量,只需向编译器指定它存在。如果没有,您将在链接时出错。

我建议你阅读更多关于extern keyword

一个简单的使用示例是两个 .c 文件,一个将您的 extern 变量作为全局变量,另一个用于打印此变量

文件.c

int value = 5;

main.c

int main() {
  extern int value;

  printf("%i\n", value);
  return 0;
}

使用gcc file.c main.c 编译它会输出5

【讨论】:

    【解决方案2】:

    外部变量的值必须在定义它们的函数之外定义。

    【讨论】:

      【解决方案3】:

      extern 关键字在默认情况下(例如没有初始化器)提供变量的声明。你需要定义你的变量。建立内部联系:

      #include <stdio.h>
      #include <stdlib.h>
      
      static int i;
      
      int main(int number, char arg[])
      {
          extern int i;
          i = 5;
          printf("%d",i);
          return 0;
      }
      

      还有一个外部链接:

      #include <stdio.h>
      #include <stdlib.h>
      
      int i;
      
      int main(int number, char arg[])
      {
          extern int i;
          i = 5;
          printf("%d",i);
          return 0;
      }
      

      另见here。

      C11 (n1570),第 6.2.2 节标识符的链接
      对于使用存储类说明符 extern 声明的标识符 该标识符的先前声明可见的范围) 如果先前的声明指定了内部或外部链接,则 在后面的声明中标识符的链接与 在先前声明中指定的链接。如果没有事先声明 可见,或者如果先前的声明没有指定链接,则 标识符有外部链接。

      【讨论】:

        【解决方案4】:

        写的时候

        extern int i;
        

        您只是在声明(但没有定义)一个名为 i 的变量。您需要在程序的某处定义i。例如,它可能就在main 之后或另一个.c 文件中

        int main(int number, char* arg[])
        {
            extern int i;
            i = 5;
            printf("%d",i);
            return 0;
        }
        int i; //here you define i
        

        【讨论】:

          猜你喜欢
          • 2017-05-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-11-12
          • 1970-01-01
          • 2015-04-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多