仅当不存在 extern 关键字时,在头文件中定义变量才有效?
Define a variable in header file works only when extern keyword is not present?
我正在学习C
,我真的不明白header如何
文件有效,并确保我有两个问题。
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
程序在头文件中的方式没有extern
关键字
涉及到所以似乎提到了 number
和程序
输出:
Num = 0
Number = 0
第一个问题是,number
是否被初始化(数字是全局的
变量或类似的(如果 number
仅存在于头文件中)
这是合法的 code/program?
第二种情况,我们看下面的代码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`
这迫使我在 main
中声明 number
:
#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
。这意味着每个包含头文件的 translation unit 都会有一个变量的定义。这是不允许的,您只能将一个定义分布在所有翻译单元上。
该问题的解决方案是 声明 头文件中的变量:
extern int number;
关键字extern
的使用将其标记为声明而不是定义,编译器将知道该变量在其他地方定义。
那么你当然需要在某处定义它。在一个源文件中放置定义:
int number;
即正是你在最后一个变体中所做的。
除了一些程序员哥们的回答外,我还使用了以下结构:
// 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
.
我正在学习C
,我真的不明白header如何
文件有效,并确保我有两个问题。
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
程序在头文件中的方式没有extern
关键字
涉及到所以似乎提到了 number
和程序
输出:
Num = 0
Number = 0
第一个问题是,number
是否被初始化(数字是全局的
变量或类似的(如果 number
仅存在于头文件中)
这是合法的 code/program?
第二种情况,我们看下面的代码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`
这迫使我在 main
中声明 number
:
#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
。这意味着每个包含头文件的 translation unit 都会有一个变量的定义。这是不允许的,您只能将一个定义分布在所有翻译单元上。
该问题的解决方案是 声明 头文件中的变量:
extern int number;
关键字extern
的使用将其标记为声明而不是定义,编译器将知道该变量在其他地方定义。
那么你当然需要在某处定义它。在一个源文件中放置定义:
int number;
即正是你在最后一个变体中所做的。
除了一些程序员哥们的回答外,我还使用了以下结构:
// 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
.