0

私が行っているのは、(不確実性) を使用して、 (値) と(不確実性)#define UNCを計算する機能のオンとオフを切り替えることです。かなりうまく機能しますが、読み書きは簡単ではありません。これを行うより良い方法はありますか?C++ では、またはある種のタプルを使用する場合があります。と の両方で構造体を使用することもできますが、未定義のままにすることもありますが、このコードを非常に大規模に実行する予定であり、これらの不要な項目をすべてオフにして処理することでコンパイラの速度を低下させたくありません。xdxstd::pairxdxdxUNC

同様の問題に遭遇した人はいますか?

参考までに、コードは次のとおりです。

#include <stdio.h>

#define UNC

typedef struct{
    double x;
#ifdef UNC
    double dx;
#endif
    } Foo;

int force(Foo* m, Foo* a, Foo* f){
    f->x = m->x * a->x;
#ifdef UNC
    f->dx = (f->x)*(m->dx/m->x + a->dx/a->x);
#endif
    return 0;
}

int main(){
    Foo m; m.x = 3.0;
    Foo a; a.x = 2.0;
#ifdef UNC
    m.dx = 0.3;
    a.dx = 0.2;
#endif
    Foo f;
    force(&m,&a,&f);
    printf(" f is %f \n", f.x);
#ifdef UNC
    printf("df is %f \n", f.dx);
#endif
    return 0;
}
4

1 に答える 1

2

次のようにいくつかのマクロを定義できます。これにより、物事が整理されます....

#ifdef UNC
    #define SetDx(f, v) (f)->dx = (v)
    #define PRINT_UNC(x) printf x
#else
    #define SetDx(f, v)
    #define PRINT_UNC(x)
#endif

次に、コードを次のように記述します

int force(Foo* m, Foo* a, Foo* f){
    f->x = m->x * a->x;
    SetDx(f, (f->x)*(m->dx/m->x + a->dx/a->x));
    return 0;
}

int main(){
    Foo m; m.x = 3.0;
    Foo a; a.x = 2.0;
    SetDx(&m, 0.3);
    SetDx(&a, 0.2);

    Foo f;
    force(&m,&a,&f);
    printf(" f is %f \n", f.x);
    PRINT_UNC(("df is %f \n", f.dx));
    return 0;
}

このようにして、コード内の #ifdef ブロックの数を最小限に抑えることができ、読みにくくなります。メインの定義をオフにすると、SetDxおよびPRINT_UNCマクロは何もしません。PRINT_UNC(マクロでは括弧を二重にする必要があることに注意してください)。

質問の次の部分についての簡単な質問です。

...UNC がオフになると、これらすべての不要な項目を処理することでコンパイラの速度が低下します...

前処理速度が気になる?これは、コンパイラが ifdef を一種のスイッチとしてコンパイルするのに時間がかかっていることを心配しているように聞こえました...その場合、心配しないでください。プリプロセッサは未定義のブロックを強制終了するため、コンパイラはそれらを認識しません. 前処理の速度が心配な場合は、できることはあまりないと思いますが、前処理のオーバーヘッドが大きくなるとは思いませんでしたか?

于 2013-05-22T17:02:59.593 に答える