プリプロセッサについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ochaduke
記事: 36
登録日時: 4年前

プリプロセッサについて

#1

投稿記事 by ochaduke » 3年前

ご無沙汰しております。
Cのプリプロセッサの使い方で質問させてください。

(前置きが長いですが、、、)
~経緯~
  • 色々なプロジェクトで汎用的に使えるのを、ヘッダーファイルとcppファイルを用意して記述しました。・・・①
  • ところが、①を色々なプロジェクトで使おうとすると、①の中で#includeしなければならないファイルが異なってくることに気づく。
    例えば、①がx.hとx.cppだとして、プロジェクトAでは、x.cppでhoge.hを追加で#includeしなければならず、しかし、プロジェクトBではhoge.hが必要ない、みたいな感じです。
    (いちいち、余計なものを#includeしまくるのはいかがなものか。)
  • そこで、必要なものだけを#includeできるような記述をしたい!と思い、一番下のコードを書いたのですが、
<1>そもそも正しいのか
<2>お行儀が悪いなど、推奨されていない書き方なのではないか
<3>では、どのように書けばいいのか
  の3点を疑問に思いましたので、これらについて、お答えいただけると嬉しいです。
(環境、言語はwindow10、VS2015、cppです。)


以下、疑惑のコード

コード:

//x.h

class X{
public:
    X(bool include_hoge);
    void FuncA();
    //色々な関数

private:
    //色々な関数、変数
};


コード:

//x.cpp

#include "x.h"

X::X(bool include_hoge){

    //include_hoge == trueなら
    //_X_INCLUDES_HOGEを定義して
    //FUNCをhoge.h内の関数名で定義
    //falseなら、別の関数FuncCで定義

    if(include_hoge){
        #define _X_INCLUDES_HOGE
        //class Hogeにあるpublicな関数FuncBで定義
        #define FUNC h.FuncB
    }
    else{
        //どこかにある関数FuncCで定義
        #define FUNC FuncC
    }
}


#ifdef _X_INCLUDES_HOGE
#include "hoge.h"
Hoge h;
#endif


void X::FuncA(){
    //云々
    FUNC("これで大丈夫?");
    //注)FUNCの指す中身は、どちらにせよ似通った関数なので、引数は同じ型と個数になっています。
    //云々
}


どうぞ、よろしくお願いしますm(_ _)m
電車グ人生…

hide

Re: プリプロセッサについて

#2

投稿記事 by hide » 3年前

プリプロセッサはその名の通り プリ プロセス なのでコンパイルされる前に処理されます。
ゆえに、プログラムコードのif文で調整できるものではありません。
プリプロセスで分岐したいときは #if #ifdef #ifndef #endif によって分岐します。

ただ、プリプロセスで分岐するのは少しトリッキーなので本当に必要かはよく考えるべきです。
私が作るとしたら、プロジェクトBにhoge.hが不要であったとしても固定でincludeするかもう別のプログラムにしてしまいます。
今後プロジェクトCを作ることになったときどう扱うかを悩む時間、デバッグする時間が惜しいからです。

やるとしたら、Unityのプラグインのようにプラットフォームで書き方を変える必要があるもの
デバッグかどうかでログの出力を変更するもの
程度に収めたいですね。

コード:

#if UNITY_IPHONE
  PluginIOS();
#endif

#if UNITY_ANDROID
  PluginAndroid();
#endif

#if DEBUG
  Log("デバッグログ");
#endif

ochaduke
記事: 36
登録日時: 4年前

Re: プリプロセッサについて

#3

投稿記事 by ochaduke » 3年前

hide さんが書きました: プリプロセッサはその名の通り プリ プロセス なのでコンパイルされる前に処理されます。
ゆえに、プログラムコードのif文で調整できるものではありません。
ですよね。自分でも書いていて、ここが不安(合っているか?)に感じていました。
ここではっきりわかったので、とても参考になりました。

hide さんが書きました:私が作るとしたら、プロジェクトBにhoge.hが不要であったとしても固定でincludeするかもう別のプログラムにしてしまいます。
今回は、hoge.hに相当するファイルが、特にこれから更新するとか、膨大なリソースを使うとかいうことではないので、固定でincludeするようにしたいと思います。


■結論
#ifdefなどで分岐させず、今回は、不要であっても全部includeします。


勉強になります。
ありがとうございましたm(_ _)m
電車グ人生…

閉鎖

“C言語何でも質問掲示板” へ戻る