teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

update

2017/07/19 04:25

投稿

yohhoy
yohhoy

スコア6191

answer CHANGED
@@ -4,18 +4,25 @@
4
4
 
5
5
  > 2, プリプロセッサの[!]はC言語の[!]と同じ意味です??
6
6
 
7
- C標準機能です。両とも論理否定を表します。
7
+ C標準機能です。両とも論理否定を表します。
8
8
 
9
9
  > 3, インラインアセンブリではなく、アセンブリ言語をC言語と混合して使用している?
10
10
 
11
- 少し微妙ですがC標準の範囲内です。プリプロセッサをアセンブリ言語と組み合わせています。プリプロセッサはC言語(C++言語)の一部ですが、単体でも利用可能ですし、別プログラミング言語と組み合わせることも可能です。
11
+ 少し微妙ですがC標準の範囲内です。プリプロセッサをアセンブリ言語と組み合わせています。プリプロセッサはC言語(C++言語)の一部ですが、プリプロセッサ単体でも利用可能ですし、別プログラミング言語と組み合わせることも可能です。
12
12
 
13
13
  行末`\`は、物理行は分離しているが論理行としては続いていることを、プリプロセッサへ伝えるものです。
14
14
 
15
15
  > 4, 中括弧を大括弧で囲んでいる?
16
+ > これは・・・関数の定義ですか?それともマクロですか? 融合しているような・・・
17
+ > よく見ると可変長関数ですかね? 関数内部では可変長用の処理が行われていないような・・・
16
18
 
17
- GNUコンパイラの独自拡張機能です。通常の`{~}`ブロックは文(statement)です、`({~})`をとすると式(expression)とし扱えます。
19
+ 可変長マクロ引数を伴う関数マクロ(function-like macro)定義です。ここは2つのGCC独自拡張機能が使われます。
18
20
 
21
+ - 通常の`{ ~ }`ブロックは文(statement)になりますが
22
+ 、`({ ~ })`は式(expression)として扱えます。詳細は[Statements and Declarations in Expressions](https://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html)を参照ください。
23
+
24
+ - 可変長マクロ引数を`args...`で受け、マクロ定義本体では`args`で引数リストを展開します。詳細は[Variadic Macros](https://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html)を参照ください。
25
+
19
26
  > 5, 関数の中に関数を定義 & 呼び出しているんでしょうか??
20
27
 
21
28
  `list_for_each_entry`は独自定義されたマクロです。マクロ展開後はC標準機能で解釈可能です。