ブロック_(C言語拡張)とは? わかりやすく解説

Weblio 辞書 > 辞書・百科事典 > 百科事典 > ブロック_(C言語拡張)の意味・解説 

ブロック (C言語拡張)

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2023/11/10 07:54 UTC 版)

ブロック (Blocks) はAppleによるC言語Objective-CC++用の非標準の拡張であり、ラムダ式風の構文を用いてクロージャを作成する機能を提供する。ブロックはMac OS X 10.6以降とiOS 4.0以降向けのプログラムでサポートされる[1]が、サードパーティ製ランタイムでMac OS X 10.5及びiOS 2.2以降でも使用可能である。[2]

ブロックは、Grand Central Dispatchスレッディングアーキテクチャーをより容易に記述できるようにするという明確な目的でAppleによって設計された[3][4]一方で、そのアーキテクチャーから独立して他のプログラミング言語のクロージャに類似した方法で使用することもできる。AppleはブロックをGNUコンパイラコレクションの自社のブランチと[5]Clang LLVMコンパイラフロントエンドに実装している。ブロックの言語ランタイムライブラリサポートはLLVMプロジェクトの一部で利用可能である。クロノスグループはブロック構文をOpenCLのバージョン2.0よりエンキューカーネルに使用している。[6]

関数定義のように、ブロックは引数を持ち、内部でローカル変数を宣言することができる。一方で通常の関数定義とは違い、値は周囲のコンテキストから状況をとることもできる。ブロック定義はブロック内のコードへの参照及びその定義時のローカルのスタック変数の現在のスナップショットが含まれる不透明な値を生成する。ブロックは関数ポインタと同様に呼び出すことができる。

ブロックは変数に割り当てられたり、関数を越えたり、通常の関数ポインタのように使われるが、ブロックの範囲外で定義されたものを使用する際は特殊な演算子(Block_copy)でマークする必要がある。

ブロック値を与えると、ブロック内のコードは関数を呼び出す際と同じ構文を使用して、任意の時点で実行することができる。

周囲のスコープに可変のステートを取り出す簡単な例として、整数範囲イテレータがあげられる。[7]

#include <stdio.h>
#include <Block.h>
typedef int (^IntBlock)();

IntBlock MakeCounter(int start, int increment) {
	__block int i = start;
	
	return Block_copy( ^ {
		int ret = i;
		i += increment;
		return ret;
	});
	
}

int main(void) {
	IntBlock mycounter = MakeCounter(5, 2);
	printf("1回目: %d\n", mycounter());
	printf("2回目: %d\n", mycounter());
	printf("3回目: %d\n", mycounter());
	
	/* ブロックオブジェクトがコピーされているため、開放する必要がある。 */
	Block_release(mycounter);
	
	return 0;
}
/* 出力:
	1回目: 5
	2回目: 7
	3回目: 9
*/

コンパイル

Linuxでは以下のとおりである。

clang -fblocks blocks-test.c -lBlocksRuntime

GCCの入れ子関数との関係

ブロックは入れ子関数を文法的にサポートするためのC言語のGCC拡張に表面的には似ている。[8]しかしながら、ブロックとは違い、GCCの入れ子関数では内部に持ったスコープが終了したあとは呼び出すことができない。

また、GCCスタイルの入れ子関数は入れ子関数のアドレスを取得する際に、実行可能なサンク(Thunk)を動的に生成する必要がある。x86も含めたほとんどのアーキテクチャはこれらのサンクをスタックに生成し、スタックは実行可能に設定する必要がある。実行可能スタックは一般的に潜在的なセキュリティホールと考えられている。ブロックは実行可能サンクを必要としないため、この弱点を持たない。

関連項目

参考文献

外部リンク


「ブロック (C言語拡張)」の例文・使い方・用例・文例

Weblio日本語例文用例辞書はプログラムで機械的に例文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。


英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「ブロック_(C言語拡張)」の関連用語

ブロック_(C言語拡張)のお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



ブロック_(C言語拡張)のページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
All text is available under the terms of the GNU Free Documentation License.
この記事は、ウィキペディアのブロック (C言語拡張) (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。 Weblio辞書に掲載されているウィキペディアの記事も、全てGNU Free Documentation Licenseの元に提供されております。
Tanaka Corpusのコンテンツは、特に明示されている場合を除いて、次のライセンスに従います:
 Creative Commons Attribution (CC-BY) 2.0 France.
この対訳データはCreative Commons Attribution 3.0 Unportedでライセンスされています。
浜島書店 Catch a Wave
Copyright © 1995-2025 Hamajima Shoten, Publishers. All rights reserved.
株式会社ベネッセコーポレーション株式会社ベネッセコーポレーション
Copyright © Benesse Holdings, Inc. All rights reserved.
研究社研究社
Copyright (c) 1995-2025 Kenkyusha Co., Ltd. All rights reserved.
日本語WordNet日本語WordNet
日本語ワードネット1.1版 (C) 情報通信研究機構, 2009-2010 License All rights reserved.
WordNet 3.0 Copyright 2006 by Princeton University. All rights reserved. License
日外アソシエーツ株式会社日外アソシエーツ株式会社
Copyright (C) 1994- Nichigai Associates, Inc., All rights reserved.
「斎藤和英大辞典」斎藤秀三郎著、日外アソシエーツ辞書編集部編
EDRDGEDRDG
This page uses the JMdict dictionary files. These files are the property of the Electronic Dictionary Research and Development Group, and are used in conformance with the Group's licence.

©2025 GRAS Group, Inc.RSS