JavaScript is required to for searching.
跳过导航链接
退出打印视图
Oracle Solaris Studio 12.3:C++ 用户指南     Oracle Solaris Studio 12.3 Information Library (简体中文)
search filter icon
search icon

文档信息

前言

第 1 部分C++ 编译器

1.  C++ 编译器

2.  使用 C++ 编译器

3.  使用 C++ 编译器选项

第 2 部分编写 C++ 程序

4.  语言扩展

5.  程序组织

5.1 头文件

5.1.1 可适应语言的头文件

5.1.2 幂等头文件

5.2 模板定义

5.2.1 包括的模板定义

5.2.2 独立的模板定义

6.  创建和使用模板

7.  编译模板

8.  异常处理

9.  改善程序性能

10.  生成多线程程序

第 3 部分库

11.  使用库

12.  使用 C++ 标准库

13.  使用传统 iostream

14.  生成库

第 4 部分附录

A.  C++ 编译器选项

B.  Pragma

词汇表

索引

5.1 头文件

创建有效的头文件是很困难的。头文件通常必须适应 C 和 C++ 的不同版本。要提供模板,请确保头文件能容纳多个包含(幂等)。

5.1.1 可适应语言的头文件

可能需要开发能够包含在 C 和 C++ 程序中的头文件。但是,称为“传统 C”的 Kernighan 和 Ritchie C (K&C)、ANSI C、 Annotated Reference Manual C++ (ARM C++) 以及 ISO C++ 有时要求一个头文件中同一个程序元素有不同的声明或定义。(有关语言和版本之间的变化的其他信息,请参见《C++ 迁移指南》。)要使头文件符合所有这些标准,可能需要根据预处理程序宏 __STDC____cplusplus 的存在情况或值来使用条件编译。

在 K&R C 中没有定义宏 __STDC__,但在 ANSI C 和 C++ 中都对其进行了定义。可使用该宏将 K&R C 代码与 ANSI C 或 C++ 代码区分开。该宏最适用于从非原型函数定义中区分原型函数定义。

#ifdef __STDC__
int function(char*,...);      // C++ & ANSI C declaration
#else
int function();               // K&R C
#endif

在 C 中没有定义宏 __cplusplus,但在 C++ 中对其进行了定义。


注 - 早期版本的 C++ 定义了宏 c_plusplus,但没有定义 cplusplus。现在已不再定义宏 c_plusplus


可使用 __cplusplus 宏的定义来区分 C 和 C++。该宏在保证为函数声明指定 extern "C" 接口时非常有用,如以下示例所示。为了防止出现 extern "C" 指定不一致,切勿将 #include 指令放在 extern "C" 链接指定的作用域中。

#include “header.h”
...                     // ... other include files...
#if defined(__cplusplus)
extern “C” {
#endif
  int g1();
  int g2();
  int g3()
#if defined(__cplusplus)
}
#endif

在 ARM C++ 中,__cplusplus 宏的值为 1。在 ISO C++ 中,该宏的值为 199711L(用 long 常量表示的标准年月)。使用这个宏的值区分 ARM C++ 和 ISO C++。这个宏值在保护模板语法的更改时极为有用。

// template function specialization
#if __cplusplus < 199711L
int power(int,int);                       // ARM C++
#else
template <> int power(int,int);           // ISO C++
#endif

5.1.2 幂等头文件

头文件应该具有幂等性,即,多次包括头文件的效果和仅包括一次的效果完全相同。该特性对于模板尤其重要。通过设置预处理程序条件以防止头文件体多次出现,可以很好的实现幂等。

#ifndef HEADER_H
#define HEADER_H
/* contents of header file */
#endif