1

特にgcc/cppの場合、関数定義に影響を与えずに関数呼び出しだけの名前を変更するマクロトリックはありますか?

#define get_resolution __mock_get_resolution

get_resolution();上記のマクロはすべての場所を変更しますが、定義に影響を与えることなく、これを関数呼び出しに対して有効にしたいだけですvoid get_resolution()

void get_resolution()
{
}

void display()
{
    get_resolution();
}
4

3 に答える 3

3

gcc固有のソリューションとして、

 The `alias' attribute causes the declaration to be emitted as an
 alias for another symbol, which must be specified.  For instance,

      void __f () { /* Do something. */; }
      void f () __attribute__ ((weak, alias ("__f")));
于 2012-08-01T15:45:29.910 に答える
2

いいえ、CプリプロセッサはCプログラムの構造に関する意味的な知識を持っておらず、テキストトークンを見るだけです。

1つのオプションは#undef、定義の前にマクロを作成し、後で再定義することですが、これは面倒です。別のオプションは、次のようにモックしたい各関数の定義にマクロを追加することです。

#if DO_MOCKING
#define IMPLEMENT_MOCKABLE_FUNCTION(funcname) _real_ ## funcname
#define get_resolution _mock_get_resolution
#else
#define IMPLEMENT_MOCKABLE_FUNCTION(funcname) funcname
#endif

...

void IMPLEMENT_MOCKABLE_FUNCTION(get_resolution)()
{
    ...
}

また、2つのアンダースコアで始まる識別子、およびアンダースコアで始まり大文字が続く識別子は、実装(つまり、コンパイラと標準ライブラリ)によって予約されていることに注意してください。そのため、上記の例の識別子の名前を、単一のアンダースコアと小文字を使用するように変更しました。

于 2012-08-01T15:36:50.283 に答える
0

あなたはこのようなことをすることができます:

#define get_resolution __mock_get_resolution

グローバルにアクセス可能な場所(常に含めるヘッダーなど)で、次のようにします。

#undef get_resolution
void get_resolution()
{
}
#define get_resolution __mock_get_resolution

void display()
{
    get_resolution();
}

醜いハックですが、sed(1)スクリプトを書く必要がなくなります。

テストケースは次のとおりです。

$ gcc -o test test.c
$ ./test
__mock_up
$ cat test.c        
#include <stdio.h>

#define get_resolution __mock_up

int
__mock_up()
{
        printf("__mock_up\n");  
}

#undef get_resolution
int 
get_resolution()
{

}
#define get_resolution __mock_up

int main()
{
       get_resolution();
       return 0;
}
$ 
于 2012-08-01T15:43:02.603 に答える