c - 仅当不存在 extern 关键字时,在头文件中定义变量才有效?
问题描述
我现在正在学习,C
我真的不明白头文件是如何工作的,并且确定我有两个问题。
1)我们看一下下面的程序:main.c:
#include <stdio.h>
#include <string.h>
#include "functions.h"
int main( void )
{
printf( "Num = %d\n", number );
printNumber();
return 0;
}
函数.c:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "functions.h"
void printNumber( void )
{
printf("Number = %d\n", number );
}
函数.h:
#ifndef FUNCTIONS
#define FUNCTIONS
int number;
extern void printNumber( void );
#endif // FUNCTIONS
程序在头文件中的方式没有extern
涉及关键字,因此似乎有引用number
和程序输出:
Num = 0
Number = 0
第一个问题是,是否已number
初始化(如果number
仅在头文件中存在数字全局变量或类似变量),这是合法的代码/程序吗?
第二种情况,我们看一下main.c下面的代码:
#include <stdio.h>
#include <string.h>
#include "functions.h"
int main( void )
{
printf( "Num = %d\n", number );
printNumber();
return 0;
}
函数.c:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "functions.h"
void printNumber( void )
{
printf("Number = %d\n", number );
}
函数.h:
#ifndef FUNCTIONS
#define FUNCTIONS
extern int number;
extern void printNumber( void );
#endif // FUNCTIONS
这里程序将无法编译,因为
`undefined reference to number`
这迫使我number
声明main
:
#include <stdio.h>
#include <string.h>
#include "functions.h"
int number;
int main( void )
{
printf( "Num = %d\n", number );
printNumber();
return 0;
}
哪个是正确的方法,为什么?最后一件事,为什么也不完全适用void printNumber( void )
。我看到它在有或没有extern
关键字的情况下都有效。
解决方案
对于第一个版本,在头文件中定义变量number
. 这意味着每个包含头文件的翻译单元都有一个变量定义。这是不允许的,您只能将一个定义分布在所有翻译单元中。
该问题的解决方案是在头文件中声明变量:
extern int number;
使用关键字将其extern
标记为声明而不是定义,编译器将知道该变量是在其他地方定义的。
然后你当然需要在某个地方定义它。在一个源文件中放置定义:
int number;
即,正是您在最后一个变体中所做的。
推荐阅读
- javascript - 用 expo 反应原生:'反应导航在急速模块图中不存在'
- javascript - 当我在 ES6/react 中使用 moment.tz() 时失败?
- spring - 使用外键保存实体
- python-3.x - 使用 chromedriver 点击下拉菜单并获取新网页表
- java - JUnit - 如何在测试中同时使用 TestCase 和 TestResult?
- python - 抓取 html 文本文档
- python - 计算pymongo中的所有数组
- java - 我收到空指针异常。尝试在空对象引用上调用接口方法“int java.util.List.size()”。
- sql - 如何通过大查询按 7 天移动平均线的阈值分组
- node.js - 节点模块可以需要一个香草 js 文件吗?