转自:http://hi.baidu.com/zengzhaonong/blog/item/8c10e90366c2bf733912bbb0.html
http://blog.csdn.net/wzsbll/article/details/6655919
test-1.0使用#ifndef只是防止了头文件被重复包含(其实本例中只有一个头件,不会存在重复包含的问题),但是无法防止变量被重复定义。
# vi test.c
-------------------------------
#include <stdio.h>
#include "test.h"
extern i;
extern void test1();
extern void test2();
int main()
{
test1();
printf("ok\n");
test2();
printf("%d\n",i);
return 0;
}
# vi test.h
-------------------------------
#ifndef _TEST_H_
#define _TEST_H_
char add1[] = "www.shellbox.cn\n";
char add2[] = "www.scriptbox.cn\n";
int i = 10;
void test1();
void test2();
#endif
# vi test1.c
-------------------------------
#include <stdio.h>
#include "test.h"
extern char add1[];
void test1()
{
printf(add1);
}
# vi test2.c
-------------------------------
#include <stdio.h>
#include "test.h"
extern char add2[];
extern i;
void test2()
{
printf(add2);
for (; i > 0; i--)
printf("%d-", i);
}
# Makefile
-------------------------------
test: test.o test1.o test2.o
test1.o: test1.c
test2.o: test2.c
clean:
rm test test.o test1.o test2.o
错误:
test-1.0编译后会出现"multiple definition of"错误。
错误分析:
由于工程中的每个.c文件都是独立的解释的,即使头文件有
#ifndef _TEST_H_
#define _TEST_H_
....
#enfif
在其他文件中只要包含了global.h就会独立的解释,然后每个.c文件生成独立的标示符。在编译器链接时,就会将工程中所有的符号整合在一起,由于文件中有重名变量,于是就出现了重复定义的错误。
解决方法
在.c文件中声明变量,然后建一个头文件(.h文件)在所有的变量声明前加上extern,注意这里不要对变量进行的初始化。然后在其他需要使用全局变量的.c文件中包含.h文件。编译器会为.c生成目标文件,然后链接时,如果该.c文件使用了全局变量,链接器就会链接到此.c文件
。
test-2.0
# vi test.c
-------------------------------
#include <stdio.h>
#include "test.h"
int i = 10;
char add1[] = "www.shellbox.cn\n";
char add2[] = "www.scriptbox.cn\n";
extern void test1();
extern void test2();
int main()
{
test1();
printf("ok\n");
test2();
printf("%d\n",i);
return 0;
}
# vi test.h
-------------------------------
#ifndef _TEST_H_
#define _TEST_H_
extern i;
extern char add1[];
extern char add2[];
void test1();
void test2();
#endif
# vi test1.c
-------------------------------
#include <stdio.h>
#include "test.h"
void test1()
{
printf(add1);
}
# vi test2.c
-------------------------------
#include <stdio.h>
#include "test.h"
void test2()
{
printf(add2);
for (; i > 0; i--)
printf("%d-", i);
}
个人认为解决此类问题有几种办法:
1.在.cpp里定义变量,在其他调用处使用extern
2.在头文件里使用宏定义
分享到:
相关推荐
总结来说,头文件不宜定义变量的原因在于: 1. 可能导致重复定义的错误,特别是在大型项目中,这会影响程序的正确编译和链接。 2. 不符合头文件的设计原则,头文件应仅包含接口声明,而不包含实现细节。 3. 使用`...
* 总头文件:声明全局变量和包含主程序文件中需要的头文件、宏定义等。 * 主程序:主程序一般包括初始化与主循环两大部分。初始化包括堆栈初始化、系统初始化、I/O端口初始化、中断初始化等。主循环是程序的工作循环...
- **Inline Functions**:内联函数可以在多个源文件中定义,但每个定义都必须出现在一个头文件中,并且该头文件应该被包含有内联函数实现的所有源文件包含。 - **The -inl.h Files**:某些大型项目可能使用特定的...
- **头文件结构**:头文件用于定义全局变量、函数原型等,其结构应该清晰,易于理解。 - **定义文件结构**:定义文件通常包含了实现细节,需要按照一定的规范组织。 - **头文件作用**:头文件的主要作用是为编译器...
- 头文件和定义文件的命名应当具有明确的逻辑,反映其功能或包含的内容。 - 合理的目录结构有助于组织和查找代码,遵循模块化原则,使项目结构清晰。 - 版权和版本声明应完整,以保护知识产权并方便追踪代码的...
- **头文件规则**:头文件用于存放函数声明、类型定义等,需要遵循特定的规则以确保一致性。 ##### 4. 缩进 - **缩进原则**:使用标准的缩进方式来组织代码,以增强可读性。 - **行长度**:每行代码不宜过长,通常...
- **头文件结构**:规范了头文件的组织方式,包括必要的预处理器指令、宏定义、类型定义等,确保头文件的清晰性和一致性。 - **定义文件结构**:定义文件中通常包含具体的实现细节,应遵循一定的格式和结构来增强...
- **头文件的作用**:头文件不仅提供了接口的声明,还可能包含宏定义、类型定义等,是链接不同源文件的重要桥梁。 - **目录结构**:良好的项目应该有清晰的目录结构,便于管理和查找代码,如分离源代码、头文件、...
本文将深入解析这些规范,帮助开发者更好地理解和遵循华为的C语言编程标准。 1、代码总体原则 华为编程规范强调代码的可读性、可维护性和可扩展性。这意味着代码应当结构清晰,逻辑明确,避免过度复杂的设计。注释...
### C/C++编码风格与编码规范重要知识点解析 #### 一、引言 在软件开发领域,编写高质量的代码不仅关系到程序的稳定性和可维护性,更是衡量一个程序员专业水平的重要标志。《高质量C++/C编程指南》这本书正是为了...
- **头文件结构**:头文件通常包含全局性的定义、宏定义以及类型声明等,其结构清晰对于维护非常重要。 - **定义文件结构**:定义文件用于存储全局变量、宏定义等,应遵循一定的格式化规则以保持一致性。 - **头文件...