質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

2回答

326閲覧

[C++]FOREACH_BBマクロが上手く使えない

退会済みユーザー

退会済みユーザー

総合スコア0

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/03/30 09:48

前提・実現したいこと

C++で将棋エンジンを作成していて、指し手生成の部分で

cpp

1#define FOREACH_BB(bitboard, sq, process) \ 2{\ 3 for (uint64_t temp_bits = (bitboard).extract<1>(); temp_bits; temp_bits = _blsr_u64(temp_bits)) { \ 4 sq = (Square)(_tzcnt_u64(temp_bits) + 63ULL); \ 5 process \ 6 } \ 7 for (uint64_t temp_bits = (bitboard).extract<0>(); temp_bits; temp_bits = _blsr_u64(temp_bits)) { \ 8 sq = (Square)_tzcnt_u64(temp_bits); \ 9 process \ 10 } \ 11}\

このようなマクロを定義して

cpp

1Square sq; 2FOREACH_BB(pieces, sq, { 3 Bitboard effect = P == GenKyosha ? computeKyoshaEffect(C, sq, occ) 4 : P == GenKeima ? keima_effect(C, sq) 5 : P == GenGin ? gin_effect(C, sq) 6 : zero_bb(); 7 8 moves = _add_moves<P, C, All>(sq, dest_bb & effect, moves); 9})

のように使っているのですが、「左側の 中かっこ '{' に対応するものがファイルの最後まで検出されませんでした。」というコンパイルエラーが出ます。何かマクロの定義、あるいは使い方に問題があるでしょうか。マクロを使わずに書くとエラーは消えます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

こんにちは。

退会されてますが、回答しておきます。

moves = _add_moves<P, C, All>(sq, dest_bb & effect, moves);

恐らく原因は、上記の<P, C, All>の部分です。この中の ,(カンマ)がマクロの引数区切りと解釈され、FOREACH_BBマクロに 5つのパラメータが渡されている事になっているのだろうと思います。
その結果、閉じカッコが展開されず、対応なしになっているということかと。

マクロは、パラメータを渡す時、()で括れば1つの引数として渡されます。
そして、()を解除するマクロを書けますので、それで対処することは可能です。

投稿2018/03/31 02:35

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

マクロの中に改行を入れるというのがまずいでしょ
その上、中にコンマがあるとそれで区切られるんでそれもまずいんじゃないかと。

全部1行で記述して、なおかつコンマは書かないように、、って無理ですねw

投稿2018/03/30 23:26

y_waiwai

総合スコア87749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2018/03/31 00:26

お、もしかして行末に \ いれてったらいけるの、かな?w
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問