0

C++ (g++) としてもコンパイルする必要がある C (特に gcc を対象とする) で記述されたコードがいくつかあります。処理が困難な構造に出くわしました。

基本的に定数のアドレスを取る多くの場所で使用されるマクロがいくつかありますが、それらは非定数でも機能します。コンストラクトは次のようになります。

int *iptr = (&(int){5});

これが本質的に可能にするのは、定数を指定することです。次に、その定数へのポインターを、int ポインターを必要とする関数で使用するために取得できますが、定数のみが指定されます。実際の一時配列を構築するために、中括弧内に複数の値を指定することもできます。そして、それはうまく機能します。

問題は、g++ がこれをまったく好まず、スローすることです。

error: non-lvalue in unary `&'

更新:次のようなことを行うことで、C++ で定数のアドレスを取得できるようです。

const int & ref = 5;

それが、私が取ろうとしている方向の出発点です。

4

1 に答える 1

0

以下は C と C++ の両方で動作するように見えますが、C++03 ではなく C++11 でのみコンパイルされます。

#ifdef __cplusplus
#define A(type,x) (&(const type &)(type)x)
#define Of(...) { __VA_ARGS__ }
#else
#define A(type,x) (&(type){x})
#define Of(...) __VA_ARGS__
#endif

テストコード:

int test(const void *ptr,int len) {
  char *str = (char *)ptr;
  int i;
  for (i=0;i<len;i++) {
    printf("%02X ",str[i]);
  }
  printf("\n");
  return 0;
}


int main() {
  test(A(int,5),4);
  test(A(x,Of(5,6)),8);

  int i=1,j=2;
  test(A(x,Of(i,j)),8);
}

編集:おっと、そこまでではありません。型がポインタの場合は機能しません!

test(A(char *,9),4); 

=>

error: invalid cast of an rvalue expression of type 'char*' to type 'const char*&'

注:別のアプローチ(CコードをCとしてコンパイルし、C ++経由でリンクする)を支持してこのアプローチを放棄していますが、誰かにとって役立つ場合に備えて、この回答を維持します。

于 2013-02-19T17:34:00.797 に答える