【问题标题】:Using extern variables in multiple C files在多个 C 文件中使用外部变量
【发布时间】:2014-12-04 15:33:03
【问题描述】:

您好 StackOverflow 向导:

我有以下三个简单的 C 文件:

// File 1
#include "mainPgm.h"
void file1() {
  printf("N1 is now %d.\n", n1);                    
}

// File 2
#include "mainPgm.h"
void file2() {
  printf("N2 is now %d.\n", n2);                    
}

// File 3
#include "mainPgm.h"
void file3() {
  printf("N3 is now %d.\n", n3);                    
}

当然还有一个主程序:

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

int main() {
  int n1 = 65536,
      n2 = 256,
      n3 = 16;

  file1();
  file2();
  file3();
}

最后是一个头文件:

#include<stdio.h>
void file1(), file2(), file3();
extern int n1, n2, n3;

所有这些都是用一个简单的 gcc 命令编译的:

gcc -std=gnu99 -O2 -o jj -Wunused file1.c file2.c file3.c mainPgm.c

这会导致以下错误:

mainPgm.c: In function ‘main’:
mainPgm.c:8:7: warning: unused variable ‘n3’ [-Wunused-variable]
mainPgm.c:7:7: warning: unused variable ‘n2’ [-Wunused-variable]
mainPgm.c:6:7: warning: unused variable ‘n1’ [-Wunused-variable]
/tmp/ccVQjFHY.o: In function `file1':
file1.c:(.text+0x2): undefined reference to `n1'
/tmp/ccZqyI0n.o: In function `file2':
file2.c:(.text+0x2): undefined reference to `n2'
/tmp/ccbpJOpN.o: In function `file3':
file3.c:(.text+0x2): undefined reference to `n3'
collect2: error: ld returned 1 exit status

认为在 mainPgm.h 中定义 n1、n2 和 n3 将用于声明变量,而它们在 mainPgm.c 中的定义将定义它们。不这样!我哪里做错了?

TIA!

【问题讨论】:

  • 您可能(或可能不)注意:(1)您的主程序不使用来自&lt;stdlib.h&gt;&lt;stdio.h&gt; 的任何代码(因此这些包含是不必要的); (2) 标头"mainPgm.h" 不需要包含&lt;stdio.h&gt;,因为其中的任何声明都不依赖于来自&lt;stdio.h&gt; 的任何声明——但如果您从"mainPgm.h" 中删除了&lt;stdio.h&gt;,则需要在每个fileN.c 文件中明确包含&lt;stdio.h&gt;。在mainPgm.c 文件中,您实际上包含了两次&lt;stdio.h&gt;。这是无害的;标准 C 标头是自包含且幂等的。你的标题也应该是。
  • 我从 mainPgm.c 中删除了 stdio 和 stdlib 声明,并且没有编译问题。

标签: c linux gcc extern


【解决方案1】:

您的所有变量都是main() 内部的局部变量,它们永远不会从该函数外部可见。

将它们移出以便它们是全球性的:

  int n1 = 65536,
      n2 = 256,
      n3 = 16;

int main() {
  file1();
  file2();
  file3();

  return EXIT_SUCCESS;
}

【讨论】:

  • 这是问题的核心,程序现在可以运行了。谢谢!
【解决方案2】:

您在堆栈上的 main() 函数中定义了变量。

你可以在同一个文件中定义它们,但在你的主函数之外。

另外一种常见的 c 习惯用法是使用预处理器在除一个头文件实例之外的所有实例中将变量声明为 extern。

【讨论】:

    猜你喜欢
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 2018-11-07
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    • 2020-07-11
    • 2023-03-21
    相关资源
    最近更新 更多