2

私は C が初めてで、いくつかのマクロ ステートメントを試しています。次のような行があります。

#define write_data(src, TYPE, VALUE ) (write_implement(src, sizeof(TYPE), &(VALUE)))

そして、後の関数で、別のメモリ ゾーンmemcpyにコピーするために使用したいと思います。VALUEこのような:

void write_implement (void* src, int size_of_type, void* value)
{
    //whatever, just making the destination address from the source address
    void* dest = src + 4096;
    memcpy(dest, value, size_of_type);
}

渡される VALUE は、あらゆる種類のデータにすることができます。そのため、void* を使用してそれを指し、memcpy を使用してサイズのバイト数をコピーしています。

しかし、もちろんうまくいきません:)

これは私が関数を呼び出す方法です:

write_data(addr, int, i*3); // i is a whatever integer variable

GCCは私にこれを与えます:

エラー: 左辺値は単項 '&' として必要です オペランド

コピーにアドレスを使用できるようにするために、マクロに渡される変数のアドレスを見つける方法を知っている人はいますか?

マクロの後半部分は変更できます (「write_implement」とパラメーターは変更できますが、「write_data」パラメーターは変更できません)。また、実装部分も自由に変更できます。

4

3 に答える 3

5

コンパイラが C99 複合リテラルをサポートしている場合は、次のようにすることができます。

#define write_data(src, TYPE, VALUE) write_implement(src, sizeof(TYPE), &(TYPE){ VALUE })
于 2010-11-16T02:22:10.317 に答える
1

これはどう:

#define write_data(src, TYPE, VALUE ) { \
        TYPE xxxx##__LINE__ = (VALUE); \
        write_implement(src, sizeof(TYPE), &(xxxx##__LINE__)); \
    }

アドレスを渡す前に、やや「ランダムな」変数を使用して値を格納します。

于 2010-11-16T02:19:17.917 に答える
0

マクロを展開すると、&(i * 3)意味のない 3 番目のパラメーター が取得されます。変数のアドレスは取得できますが、無名の式の結果は取得できません。

型を保持するために使用して値を渡したい場合はvoid*、それを保持する名前の実際の変数を用意することをお勧めします。

int i = 5;
int j = i * 3;
write_data(addr, int, j);

ただし、関数を直接呼び出す方がクリーンだと言わざるを得ません。

write_implementation(addr, sizeof(int), &j);

C の魔法を使って、マクロ呼び出しを思い通りに見せることは可能ですが、私はそうしないことをお勧めします。

#define write_data(src,type,value) \
    {type t = (value); write_implementation(src, sizeof(type), &t);}

write_data(addr, int, i*3);

余談ですが、C++ テンプレートを使用すると、式の結果を希望どおりに使用でき、少しきれいになります (キーは const ref です)。

template <typename T>
write_impl(T& dest, const T& src)
{
    memcpy(&dest, &src, sizeof(T));
}

// 'int' is the default type of 5*3
int intResult;
write_impl(intResult, 5*3);

// 'double' is the default type of 5.1*4.7
double doubleResult;
write_impl(doubleResult, 5.1*4.7);

// otherwise, have to cast
long longResult
write_impl(longResult, (long)5*3);
于 2010-11-16T02:18:41.317 に答える