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

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

新規登録して質問してみよう
ただいま回答率
85.49%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

1回答

2437閲覧

複数行に渡る関数形式マクロを使用してもdoxygenで正常にドキュメント出力したい

megane814

総合スコア11

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2017/08/30 15:46

編集2017/09/14 15:02

###関数形式マクロを使用してもドキュメントをdoxygenで出力したい
Windows・Cygwin環境下にて、C言語で開発を行なっています。
詳細設計レベルのドキュメントに関してはdoxygenで出力することになっているのですが、少々困っています。

下記に紹介するような複数行に渡る関数形式マクロを使用すると、2つの問題が発生してしまいました。

  1. 未知の定義¥HOGE_MAXが定義される(doxygen warningの発生)
  2. 出力したHTMLドキュメントの関数mogeについて、static void moge ( int c, int d )の説明と、moge(x, MOO)の説明の、2つの説明が表示される
  3. 出力したHTMLドキュメントにHOGE_MAXの説明「影響を受ける記述」が表示されない

複数行に渡る関数形式マクロを使用しても、意図通りにdoxygenでドキュメントを出力するための方法はありますでしょうか。

###該当のソースコード

C

1 2static void hoge ( int a, int b ); 3static void moge ( int c, int d ); 4 5/** 6 * @def FOO (-1) 7 * 適当な説明 8 */ 9#define FOO (-1) 10 11/** 12 * @def MOO (1) 13 * 適当な説明 14 */ 15#define MOO (1) 16 17/** 18 * @def Hoge(x) 19 * 問題が発生する原因となるマクロ 20 */ 21#define Hoge(x) ¥ 22{ ¥ 23 hoge(x, FOO); ¥ 24 moge(x, MOO); ¥ 25} 26 27/** 28 * @def HOGE_MAX (0xFF) 29 * 影響を受ける記述 30 */ 31#define HOGE_MAX (0xFF) 32 33/** 34 * @brief 適当な説明 35 * 36 * @param[in] (a) 適当な説明 37 * @param[in] (b) 適当な説明 38 * @return - 39 */ 40static void hoge ( int a, int b ) 41{} 42 43/** 44 * @brief 適当な説明 45 * 46 * @param[in] (c) 適当な説明 47 * @param[in] (d) 適当な説明 48 * @return - 49 */ 50static void moge ( int c, int d ); 51{}

表示されたエラーメッセージ

Searching for documented defines...

hoge.c:12: warning: documentation for unknown define ¥HOGE_MAX found.

関数形式マクロの改行に使用した¥が後の@defに影響を与えているようです。

###試したこと

試したことその1

C

1 2static void hoge ( int a, int b ); 3static void moge ( int c, int d ); 4 5/** 6 * @def FOO 7 * 適当な説明 8 */ 9#define FOO (-1) 10 11/** 12 * @def MOO 13 * 適当な説明 14 */ 15#define MOO (1) 16 17/** 18 * @def Hoge(x) 19 * 適当な説明 20 */ 21#define Hoge(x) ¥ 22{ ¥ 23 hoge(x, FOO); ¥ 24 moge(x, MOO); ¥ 25} 26 27/** @def */ /* <---- このコメントを追加 */ 28 29/** 30 * @def HOGE_MAX (0xFF) 31 * ほげ最大値 32 */ 33#define HOGE_MAX (0xFF) 34 35/** 36 * @brief 適当な説明 37 * 38 * @param[in] (a) 適当な説明 39 * @param[in] (b) 適当な説明 40 * @return - 41 */ 42static void hoge ( int a, int b ) 43{} 44 45/** 46 * @brief 適当な説明 47 * 48 * @param[in] (c) 適当な説明 49 * @param[in] (d) 適当な説明 50 * @return - 51 */ 52static void moge ( int c, int d ); 53{}

コメント/** @def */を追加すると、ワーニングは消えました。
(問題点1は解消されました)
どういう作用によるものかはわかっていません。
(正しく書くなら/** * @def */だと思いますが、これでは解消されませんでした)
(@defの代わりに@fnでは解消されませんでした)
問題点2は解消されませんでした。
問題点3も解消されませんでした。

試したことその2

回答で頂いたセミコロンを追加する案を試してみました。

C

1 2static void hoge ( int a, int b ); 3static void moge ( int c, int d ); 4 5/** 6 * @def FOO 7 * 適当な説明 8 */ 9#define FOO (-1) 10 11/** 12 * @def MOO 13 * 適当な説明 14 */ 15#define MOO (1) 16 17/** 18 * @def Hoge(x) 19 * 適当な説明 20 */ 21#define Hoge(x) ¥ 22{ ¥ 23 hoge(x, FOO); ¥ 24 moge(x, MOO); ¥ 25} 26 27; /* <---- このセミコロンを追加 */ 28 29/** 30 * @def HOGE_MAX (0xFF) 31 * ほげ最大値 32 */ 33#define HOGE_MAX (0xFF) 34 35/** 36 * @brief 適当な説明 37 * 38 * @param[in] (a) 適当な説明 39 * @param[in] (b) 適当な説明 40 * @return - 41 */ 42static void hoge ( int a, int b ) 43{} 44 45/** 46 * @brief 適当な説明 47 * 48 * @param[in] (c) 適当な説明 49 * @param[in] (d) 適当な説明 50 * @return - 51 */ 52static void moge ( int c, int d ); 53{}

セミコロンを追加した場合、問題点1は解消されます。
しかし、代わりに、HTMLドキュメントに変数¥が出力されるようになってしましました。
また、問題点2、問題点3は解消されませんでした。

###補足情報(言語/FW/ツール等のバージョンなど)
Windows
Cygwin
C言語

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

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

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

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

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

guest

回答1

0

ちょっと今doxygenを動かせる環境にないのですが、関数形式のマクロを「@def」ではなく「@fn」にしてもダメなんでしょうか?


追記:
確かに、ダメですね。定義が逆の場合は出るのですが・・・。
「@fn」でも同じですね。
色々やってみましたがダメでした。
マクロの行分けに使っているバックスラッシュが悪さをしているのでしょうね。

オプションを色々探してみましたがそれらしいものが見当たりませんね。
解決になっておらずすいません。


再追記:
うまく出ましたよ!
以下のように、関数形式の複数行マクロと次の定義の間にセミコロン(;)を入れれば出るようになります。

C

1/** 2 * @def Hoge(x) 3 * 適当な説明 4 */ 5#define Hoge(x) ¥ 6{ ¥ 7 (x+1) ¥ 8} 9 10; /* <-- これを追加 */ 11 12/** 13 * @def HOGE_MAX (0xFF) 14 * ほげ最大値 15 */ 16#define HOGE_MAX (0xFF) 17

セミコロンだけの行はC/C++では無視されるのでコンパイルエラーにもなりません。(VC++ではそう)
ところでこの関数形式のマクロですがこのままではエラーになりますね。(セミコロンがないので)

投稿2017/09/14 08:08

編集2017/09/14 09:08
PineMatsu

総合スコア3579

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

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

megane814

2017/09/14 14:18

ご回答頂きありがとうございます。 セミコロン、試してみました。 すると……ワーニングは消えましたが、「変数¥」が出力されてしまいました。 残念です。
megane814

2017/09/14 15:05

マクロ中のセミコロン抜け、修正致しました。 ご指摘、ありがとうございました。
PineMatsu

2017/09/15 08:04

確かに「変数\」が出てますね。 どうも、難しいのかもしれません。セミコロンを思いついたのは、doxygenの説明を読んでいて、セミコロンなしでマクロを使っているとおかしくなるようなことが書いてあったので、よもやと思ってやってみました。 となると、doxygenの開発している人に直接質問を投げてみないと難しいかもしれません。
megane814

2017/09/17 06:39

ですかー……。 引き続き回答を募集しつつ、doxygenの中の人にコンタクト、取ってみようかと思います。 日本語で質問できると良いのですが……。
PineMatsu

2017/09/21 08:13

free.mlに日本語のメーリングリストがありますね。 まずはここで聞いてみるのが良いかもしれません。 http://www.freeml.com/doxygen 本家は英語なので↓です。 https://sourceforge.net/p/doxygen/mailman/ 以前TortoiseSVNの英語のメーリングリストに質問したことが有ります。Google翻訳を使って四苦八苦しながら書いてました。(その時は切実だったので) Google翻訳を使って投げればそれなりの返事は返ってくると思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問