

ヘッダファイルで `#define SET_VALUE "%.3f"` と定義しており、  
ソースコードには `str.Format(SET_VALUE, dValue);` という処理が複数個所あるとします。

`Format()` メソッドで3桁と5桁に変換する分岐処理を行いたいのですが、  
1つの方法は `#define` 定義を2つにし、

[code]

    #define SET_VALUE3 "%.3f" 
    #define SET_VALUE5 "%.5f" 
    
[/code]

変換処理の前で、例えば

[code]

    if(MODE == 1)
    { 
         str.Format(SET_VALUE3, dValue)
    }
    else
    {
        str.Format(SET_VALUE5, dValue)
    }
    
[/code]

とする方法があると思いますが、複数個所あるため、`str.Format(SET_VALUE, dValue)` はそのままにして、  
`#define SET_VALUE` の値を `"%.3f"` , `"%.5f"` に場合分けし、  
特定の条件ならば `SET_VALUE` は `"%.3f"` 、それ以外ならば`SET_VALUE` は `"%.5f"` とdefine定義される  
分岐の判定処理を作成したいのですが、`define` の分岐は可能なのでしょうか？

伝わっているかわかりませんがご教示お願いします。


CC BY-SA 4.0
2019-08-29T07:09:36.390
57690
2019-08-29T10:40:39.447
2019-08-29T07:28:31.307
8589
35644
question
c++
defineで定義した値を条件によって変更する方法


「特定の条件」が「コンパイル時に決定される」ものであるなら #ifdefディレクティブ等を用いて分岐できます。  
「c言語 プリプロセッサ ディレクティブ」等のキーワードで検索してみてはどうでしょう。

「特定の条件」が「実行時に変化する」ものであるなら、#defineではできませんので、  
外部参照されるグローバルな文字列の変数とするしかないかもしれません。

例えば、strがCStringであると仮定すると、

[code]

    extern CString SET_VALUE; // (旧)#define SET_VALUE "%.3f" // フォーマット
    
[/code]

の様に外部変数化して、その実体とそれをセットアップする関数を用意するしかないかもしれません。

[code]

    CString SET_VALUE; // (暫定)外部で参照されるグローバル
    void SetValue_Format_Change( ex_Mode)
    {
        if( ex_Mode == 1){ SET_VALUE = "%.3f";} // SET_VALUE = SET_VALUE3
        else{              SET_VALUE = "%.5f";} // SET_VALUE = SET_VALUE5 相当機能
    }
    
[/code]

ただし、あくまでも暫定対策としての提案です。  
なぜなら、この場合SET_VALUEが持つ「意味」が以前のものと「質的な変化」をしてしまっているため、この宣言、定義、及び参照箇所は「変化した意味による相応の変更がなされるべき」だからですね。


CC BY-SA 4.0
2019-08-29T07:46:40.023
57691
2019-08-29T07:52:32.547
2019-08-29T07:52:32.547
3793
3793
57690
answer

[code]

    int precision = MODE == 1 ? 3 : 5;
    str.Format(".*f", precision, dValue);
    
[/code]

といった書き方ができます。その上で、フォーマット文字列をヘッダーファイルに定義するよりは、書式化済み文字列を返す関数を定義するべきではないでしょうか？


CC BY-SA 4.0
2019-08-29T10:40:39.447
57696
2019-08-29T10:40:39.447
4236
57690
answer