C语言前置声明具体用法和案例分析是怎样的?

2026-05-19 23:521阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计913个文字,预计阅读时间需要4分钟。

C语言前置声明具体用法和案例分析是怎样的?

C++// 前置声明说明及示例【1】一般的前置函数声明前置函数声明通常用于在函数定义之前声明函数的接口,以便在函数定义之前使用该函数。以下是一个前置函数声明的示例:

void printMessage(const std::string& message);

【2】最常见的预处理函数声明在C++中,预处理函数声明通常用于声明那些在编译预处理阶段就会调用的宏或函数。以下是一个预处理函数声明的示例:

#define MAX_SIZE 100

C++ 前置声明详解及实例

C语言前置声明具体用法和案例分析是怎样的?

一般的前置函数声明

见过最多的前置函数声明,基本格式代码如下:

#include <iostream> using namespace std; void fun(char ch, int *pValue, double dValue); void main() { int nValue = 100; double dValue = 111.22; fun('a', &nValue, dValue); system("pause"); } void fun(char ch, int *pValue, double dValue) { return; }

很好理解,不做赘述。

自定义类型的前置声明

自定义类型的前置声明,由于编译器不知道类型的大小,所以不可以声明类型的对象。只可以利用类型声明指针和引用。

代码如下:

/* * 自定义类型前置声明 */ #include <iostream> using namespace std; class B; class A { private: // 内置类型 int m_nInt; int& m_nRInt; int* m_pInt; // 自定义类型 // B b; // error! B* m_pB; B& m_b; public: A (B *pBPara = NULL) : m_nInt(100) , m_nRInt(m_nInt) , m_pInt(NULL) , m_pB(NULL) , m_b((NULL == pBPara) ? (*m_pB) : (*pBPara)) { cout << "A()" << endl; } ~A() { cout << "~A()" << endl; } void funA() { // m_pB->doAnything(); // build error C2027: use of undefined type 'B' } }; class B { private: int m_n; public: B (int n = 100) : m_n(n) { cout << "B()" << endl; } ~B() { cout << "~B()" << endl; } void doAnything() { cout << "B::anythig()" << endl; } }; void main() { A objA; system("pause"); }

如上,利用前置类型的指针想调用其成员函数,会报编译错误!那么,肿么办?请看下文。

声明和实现分离

代码如下,声明头文件:

/* * TestForwardDeclar.h */ #ifndef D_TESTFORWARDDECLAR_H_ #define D_TESTFORWARDDECLAR_H_ #include <iostream> class B; // 前置声明自定义类型 class A { private: // 内置类型 int m_nInt; int& m_nRInt; int* m_pInt; // 自定义类型 // B b; // error! B* m_pB; B& m_b; public: A (B *pBPara = NULL); ~A (); void funA(); }; class B { private: int m_n; public: B (int n = 100); ~B (); void doAnything(); }; #endif

代码如下,定义文件:

/* * TestForwardDeclar.cpp */ #include "TestForwardDeclar.h" #include <iostream> A::A (B *pBPara) : m_nInt(100) , m_nRInt(m_nInt) , m_pInt(NULL) , m_pB(NULL) , m_b((NULL == pBPara) ? (*m_pB) : (*pBPara)) { std::cout << "A()" << std::endl; } A::~A() { std::cout << "~A()" << std::endl; } void A::funA() { m_pB->doAnything(); // 分开头文件和实现文件即可 } B::B (int n) : m_n(n) { std::cout << "B()" << std::endl; } B::~B() { std::cout << "~B()" << std::endl; } void B::doAnything() { std::cout << "B::anythig()" << std::endl; }

代码如下:测试文件:

#include "TestForwardDeclar.h" void main() { A objA; }

编译成功,运行结果是期望效果。

总结

自定义类型前置声明时,只可以利用类型名声明指针和引用变量(谨记不可以声明对象或new 对象,均因为类型大小不确定,编译器无能为力)。

若需要利用指针或引用调用前置类型的接口,必须按照声明和实现分离的方式进行编码。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

本文共计913个文字,预计阅读时间需要4分钟。

C语言前置声明具体用法和案例分析是怎样的?

C++// 前置声明说明及示例【1】一般的前置函数声明前置函数声明通常用于在函数定义之前声明函数的接口,以便在函数定义之前使用该函数。以下是一个前置函数声明的示例:

void printMessage(const std::string& message);

【2】最常见的预处理函数声明在C++中,预处理函数声明通常用于声明那些在编译预处理阶段就会调用的宏或函数。以下是一个预处理函数声明的示例:

#define MAX_SIZE 100

C++ 前置声明详解及实例

C语言前置声明具体用法和案例分析是怎样的?

一般的前置函数声明

见过最多的前置函数声明,基本格式代码如下:

#include <iostream> using namespace std; void fun(char ch, int *pValue, double dValue); void main() { int nValue = 100; double dValue = 111.22; fun('a', &nValue, dValue); system("pause"); } void fun(char ch, int *pValue, double dValue) { return; }

很好理解,不做赘述。

自定义类型的前置声明

自定义类型的前置声明,由于编译器不知道类型的大小,所以不可以声明类型的对象。只可以利用类型声明指针和引用。

代码如下:

/* * 自定义类型前置声明 */ #include <iostream> using namespace std; class B; class A { private: // 内置类型 int m_nInt; int& m_nRInt; int* m_pInt; // 自定义类型 // B b; // error! B* m_pB; B& m_b; public: A (B *pBPara = NULL) : m_nInt(100) , m_nRInt(m_nInt) , m_pInt(NULL) , m_pB(NULL) , m_b((NULL == pBPara) ? (*m_pB) : (*pBPara)) { cout << "A()" << endl; } ~A() { cout << "~A()" << endl; } void funA() { // m_pB->doAnything(); // build error C2027: use of undefined type 'B' } }; class B { private: int m_n; public: B (int n = 100) : m_n(n) { cout << "B()" << endl; } ~B() { cout << "~B()" << endl; } void doAnything() { cout << "B::anythig()" << endl; } }; void main() { A objA; system("pause"); }

如上,利用前置类型的指针想调用其成员函数,会报编译错误!那么,肿么办?请看下文。

声明和实现分离

代码如下,声明头文件:

/* * TestForwardDeclar.h */ #ifndef D_TESTFORWARDDECLAR_H_ #define D_TESTFORWARDDECLAR_H_ #include <iostream> class B; // 前置声明自定义类型 class A { private: // 内置类型 int m_nInt; int& m_nRInt; int* m_pInt; // 自定义类型 // B b; // error! B* m_pB; B& m_b; public: A (B *pBPara = NULL); ~A (); void funA(); }; class B { private: int m_n; public: B (int n = 100); ~B (); void doAnything(); }; #endif

代码如下,定义文件:

/* * TestForwardDeclar.cpp */ #include "TestForwardDeclar.h" #include <iostream> A::A (B *pBPara) : m_nInt(100) , m_nRInt(m_nInt) , m_pInt(NULL) , m_pB(NULL) , m_b((NULL == pBPara) ? (*m_pB) : (*pBPara)) { std::cout << "A()" << std::endl; } A::~A() { std::cout << "~A()" << std::endl; } void A::funA() { m_pB->doAnything(); // 分开头文件和实现文件即可 } B::B (int n) : m_n(n) { std::cout << "B()" << std::endl; } B::~B() { std::cout << "~B()" << std::endl; } void B::doAnything() { std::cout << "B::anythig()" << std::endl; }

代码如下:测试文件:

#include "TestForwardDeclar.h" void main() { A objA; }

编译成功,运行结果是期望效果。

总结

自定义类型前置声明时,只可以利用类型名声明指针和引用变量(谨记不可以声明对象或new 对象,均因为类型大小不确定,编译器无能为力)。

若需要利用指针或引用调用前置类型的接口,必须按照声明和实现分离的方式进行编码。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!