- 内部結合 : Internal Linkage
- 外部結合 : External Linkage
ファイルスコープのオブジェクト定義(いわゆるグローバル変数定義)
static | 記憶クラス指定子なし | extern | |
C言語 | 内部結合定義 | 外部結合定義 | 仕様なし |
C++ | 内部結合定義 | 非const: 外部結合定義 const: 内部結合定義 |
外部結合定義 |
static | 記憶クラス指定子なし | extern | |
C言語 | 内部結合定義 | 外部結合定義 | 仕様なし |
C++ | 内部結合定義 | 非const: 外部結合定義 const: 内部結合定義 |
外部結合定義 |
1 2 |
/usr/local/include/gtest/gtest-printers.h:640:27: error: no template named 'tuple' in namespace 'std' void PrintTo(const ::std::tuple<Types...>& t, ::std::ostream* os) { |
C++11機能が無効である。
C++11機能を有効にする。
-std=c++11
C++11 における関数束縛 (Function Binding) の種類
静的束縛 | Static Binding | 事前束縛 | Early Binding | 物理関数 ※1 |
動的束縛 | Dynamic Binding | 遅延束縛 | Late Binding | 仮想関数 |
※1. C++では仮想関数ではない関数はシンプルに「関数」と呼びます。
TOPPERS/JSPのヘッダーファイルなどに throw()
の記述が多用されています。
この記述は『無例外保証(no-throw guarantee)』と呼ばれる「例外は投げません」という意味です。
下記のようにswitchブロックの内部で変数宣言をおこなうとコンパイルエラーとなる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include <stdio.h> int main(void) { int i; for (i = 0 ; i < 100 ; i++) { switch (i%2) { case 0: char msg_even[] = "EVEN"; printf("%3d is %s\n", i, msg_even); break; case 1: char msg_odd[] = "ODD"; printf("%3d is %s\n", i, msg_odd); break; default: printf("%3d is UNKNOWN\n", i); break; } } return 0; } |
派生クラスで override することができるのは、基底クラスで virtual をつけたメンバー関数(=仮想関数)だけです。しかし、もし virtualをつけていない(つけるのを忘れた)メンバー関数(=非仮想関数)を派生クラスで override しようと試みると何が起こるでしょうか?
続きを読む
プログラミング言語 C++ における演算子オーバーロードの糖衣構文的な解釈と、フレンド関数による解決
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
#include <iostream> using namespace std; class coord { int x, y; public: coord() : x(0), y(0) {} coord(int i, int j) : x(i), y(j) {} void show() { cout << "x = " << x << ", y = " << y << endl; } coord operator+(coord position); coord add(coord position); }; coord coord::operator+(coord position) { coord temp; temp.x = this->x + position.x; temp.y = this->y + position.y; return temp; } coord coord::add(coord position) { coord temp; temp.x = this->x + position.x; temp.y = this->y + position.y; return temp; } int main() { coord position_a(10, 10), position_b(5, 3); coord position_m = position_a + position_b; position_m.show(); // => x = 15, y = 13 coord position_n = position_a.add(position_b); position_n.show(); // => x = 15, y = 13 return 0; } |
※ 説明をシンプルにするために参照渡しやconst修飾は省略しています。
C/C++混在環境において 「no definition for “xxx”」などの関数定義が存在しないエラーが発生してリンクに失敗する。
『 マングル (mangle) 』, 『 名前マングリング (name mangling) 』
続きを読む