我如何实现全局变量?

时间:2017-06-05 07:52:19

标签: c gcc global-variables

我需要帮助:使用file1.h通过全局变量将file2.c中的整数值传递给file3.c

您好,我遇到一个问题,使用全局变量来识别我在密文文本项目中使用的其中一个端口。它非常大,所以我刚刚添加了解决我的问题的代码片段。

我目前用于编译的内容:gcc -o executable3 file2.c file1.h(可行)

和我的第二行(不起作用):gcc -o executable3 file3.c

编译时出现错误消息:对“GLOBALVARIABLE”的未定义引用 collect2:ld返回1退出状态

我的file1.h文件:

 ifndef FILE1_H
 define FILE1_H
 include <stdio.h>
 include <stdlib.h>
 extern int *GLOBALVARIABLE;
 endif

我初始化GLOBALVARIABLE值并将其设置为等于端口号(文件2)的文件:

#include "file1.h"
#define SIZE  128000
int *GLOBALVARIABLE;
int main(int argc, char *argv[])
{
int sockfd, newsockfd, portno;

portno = atoi(argv[1]);
GLOBALVARIABLE = &portno;

导致上述编译冲突的文件(文件3):

#include "file1.h"
#define SIZE  16000
int main(int argc, char *argv[])
{
int sockfd, portno;
portno = atoi(argv[3]);
if (portno == *GLOBALVARIABLE){
printf("Theres been a port error, you are using the wrong port for this 
command");
exit(1);

请帮忙! 谢谢!

1 个答案:

答案 0 :(得分:1)

您以错误的方式使用编译器。默认情况下,gcc会发出可运行的二进制文件,这意味着它已经执行了链接步骤。链接时,必须定义所有符号(从共享对象导入的符号除外)。

您需要做的是只将源文件(选项-c)编译成目标文件,然后将这些目标文件链接在一起:

gcc -c -ofile2.o file2.c             # <- compile
gcc -c -ofile3.o file3.c             # <- compile
gcc -oexecutable file2.o file3.o     # <- link

在实践中,添加启用警告的标志,选择C标准等等。

修改:正如评论中所指出的,main应该只存在一次。您希望以其他方式执行哪一项?

这里有两个想法:

  1. 不要将头文件(.h)放在编译器命令行上。它们包含在需要的源文件中。
  2. 如果您想在两个独立程序之间共享变量,则使用extern无法实现。 &#34;全局变量&#34;仅存在于一个进程的范围内。如果您想在流程之间共享数据,例如共享内存管道等(谷歌为他们)。