我现在C
正在学习,我真的不明白标题如何
文件有效,并确保我有两个问题。
1)让我们看一下以下程序:main.c:
#include <stdio.h>
#include <string.h>
#include "functions.h"
int main( void )
{
printf( "Num = %d\n", number );
printNumber();
return 0;
}
functions.c:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "functions.h"
void printNumber( void )
{
printf("Number = %d\n", number );
}
functions.h:
#ifndef FUNCTIONS
#define FUNCTIONS
int number;
extern void printNumber( void );
#endif // FUNCTIONS
程序在Header文件中的方式没有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;
}
functions.c:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "functions.h"
void printNumber( void )
{
printf("Number = %d\n", number );
}
functions.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
关键字。
答案 0 :(得分:1)
对于第一个版本,在头文件中定义变量number
。这意味着每个包含头文件的translation unit都将具有变量的定义。不允许这样做,您只能在所有翻译单元上使用单一定义。
该问题的解决方案是声明头文件中的变量:
extern int number;
使用关键字extern
将其标记为声明而不是定义,编译器将知道该变量是在其他位置定义的。
那您当然需要在某个地方定义它。在一个源文件中,输入以下定义:
int number;
即完全是您在最后一个变体中所做的。
答案 1 :(得分:0)
除了一些程序员大佬的答案外,我还使用以下构造:
// functions.h
#indef EXTERN
# define EXTERN extern
#endif
EXTERN int number;
// functions.c
#include "functions.h"
// main.c
#define EXTERN
#include "functions.h"
主编译时,将为number
分配存储空间。在所有其他源文件中,它将被声明为extern
。