假设在a.h文件中定义了一个结构体,然后在b.cpp中预先声明这个类型而又不引用头文件a.h,那么这个结构体可以使用吗?看看下面的例子:
struct bb; //声明存在的一个类型
struct aa
{
bb b;
};
编译这个程序,GCC显示错误:field `b' has incomplete type
稍稍修改一下这个文件:
struct bb; //声明存在的一个类型
struct aa
{
bb* b;
};
编译通过。
为什么会这样呢?C/C++采用静态的编译模型,程序运行时结构大小都会在编译后确定。程序要正确编译,编译器必须知道一个结构所占用的空间大小。在第一个例子中,结构体bb作为结构体aa的一个成员,要确定aa的大小,必须知道bb的大小,而bb的定义文件没有包含进来,必然编译不能通过。而第二个例子中,指针的大小与机器的字长有关,不管类型是什么类型,编译后指针的大小总是确定的。所以这种情况下不需要知道结构bb的确切定义。
“编译器一定要知道类型的大小”,这条信息可以帮助我们在发生编译错误的时候,更快找到错误的原因。同时,如果我们需要引入的类型仅仅只是声明成指针,则这个类型的头文件不必引入,从而这个文件的编译速度得到了提高。
分享到:
相关推荐
### C++ 学习笔记精华版 #### 一、C++ 语言概述 **1、历史背景** - **C++ 的江湖地位** - Java、C、C++、Python、C# 是当前主流的编程语言之一,而 C++ 在这些语言中以其高效性和灵活性著称。 - **C++ 之父 ...
C++编译器在处理函数声明时会考虑函数签名(包括参数类型),而C编译器不会。因此,extern "C"的作用就是让C++编译器按照C语言的方式处理函数声明,即仅使用函数名而不考虑参数类型,避免链接错误。 2. C++中的构造...
【C++ 学习笔记】深入理解编程与C++基础 C++是一种强大的、面向对象的编程语言,广泛应用于系统软件、游戏开发、嵌入式系统以及许多高性能应用。学习C++不仅仅是掌握语法,更重要的是理解编程的核心概念,以便更好...
【C++学习笔记概述】 C++是一门强大的编程语言,其在C语言的基础上进行了扩展,引入了许多现代化的特性。这份笔记主要涵盖了C++的基础知识,包括C++11和C++17的新特性,旨在帮助初学者理解C++的核心概念。 ### C++...
- **C++与标准规范**:学习的C++版本应该遵循ANSI规范,这样编写的代码具有更好的可移植性,可以在不同的操作系统和硬件平台上运行而无需进行大量修改。 ### 编译与连接过程 - **开发周期**:源程序经过一系列步骤...
【C++语言基础】 C++是一种强类型、面向对象的编程语言,遵循ANSI标准,具有高度的可移植性。...随着学习的深入,还将涉及到类、对象、模板、异常处理、内存管理等更复杂的概念,这些都是C++强大功能的核心。
C++ Primer 是一本广泛使用的C++编程教材,本系列学习笔记旨在探讨那些容易被忽视或引起误解的C++知识点,适合已经具备一定C++基础知识的读者。我们将从C++的基础部分开始,包括程序结构、数据类型以及操作符等方面...
这篇学习笔记主要涉及了C++编程的一些核心概念,包括程序结构、变量、基本类型、初始化与赋值、可读性、常量与引用、typedef、枚举以及标准库中的字符串和向量类型。 1. **程序结构**: - 每个C++程序都必须包含`...
- 反之,由于C++引入了许多新的特性,部分C++代码可能无法在纯C编译器中正确编译。 3. **标准输入输出**: - C语言使用`<cstdio>`头文件,并通过`printf()`和`scanf()`等函数进行输入输出操作。 - C++使用`...
《Visual C++程序设计学习笔记》是一份深入探讨VC++编程技术的综合资料,涵盖了从基础知识到实际系统开发的广泛内容。Visual C++是Microsoft公司推出的一种强大的集成开发环境,它集成了C++编译器、调试器以及MFC...
《Effective C++》是一本由Scott Meyers所著的关于C++编程的书籍,该书广泛被认为是对C++程序员提高编程水平和解决实际问题提供了极好的指导。从给出的部分内容来看,读书笔记主要聚焦于以下几个知识点: 1. C++...
**Dmd编译器学习笔记** Dmd是D语言的官方编译器,它是由D语言的创始人Walter Bright开发的。这篇学习笔记将深入探讨Dmd编译器的使用、特性和相关知识,帮助你更好地理解和应用D语言。 ### 1. D语言概述 D语言是一...
这篇学习笔记将深入探讨STL的核心概念、主要组件以及其在实际编程中的应用。 首先,STL的核心概念是容器、迭代器、算法和函数对象。容器是STL提供的一系列数据结构,如vector(动态数组)、list(双向链表)、set...
在本篇C++学习笔记中,我们将聚焦于使用const修饰符定义常量这一主题,以及它与指针的结合使用,还有内联函数的概念。 在C语言中,我们通常使用`#define`预处理器来定义常量,例如`#define LIMIT 100`。然而,这种...
"C++概述和面向对象程序设计" C++概述 C++是一门优秀的通用程序设计语言,它是以C语言为基础扩充、发展起来的。C++语言保存了C语言的紧凑、灵活、搞笑和移植性好的优点,又吸收了其他程序设计语言的优秀特质。C++...
**C++学习笔记--函数** 在C++编程中,函数是一种可重用的代码块,它执行特定的任务并可能接收参数、返回值或两者都有。本笔记将深入探讨C++中的函数,包括它们的定义、调用、参数传递以及如何在实际编程中有效地...
### C++ Primer 笔记知识点概述 ...以上是对C++ Primer笔记中涉及的知识点的详细总结,涵盖了文件类型、预处理器指令、注释、数据类型及内存管理等方面的基础知识,对于初学者来说是非常宝贵的学习资源。