4
int main()
{
        int i = 0;
        int *p = &i;
        int *q = &&i;
        return 0;
}

gcconを使用してこれをコンパイルするLinuxと、エラーが発生します

addr.c: In function ‘main’:
addr.c:6:2: error: label ‘i’ used but not defined

コンパイラが整数ではなく整数int iとして扱うのはなぜですか? labelいつ使用し&& operatorますか?

編集:さて、答えはある程度理解できますが、「arch/arm/include/asm/processor.h」から以下のマクロ定義を説明していただけますか。については何も述べていませんlabelが、コメントには「program counter」を返すことができると書かれています

/*
 * Default implementation of macro that returns current
 * instruction pointer ("program counter").
 */
#define current_text_addr() ({ __label__ _l; _l: &&_l;})
4

3 に答える 3

15

&& 演算子とは? C++ には単項 && 演算子はありません。GCC には計算された gotoステートメントを許可する拡張機能があり、その拡張機能は && を使用してラベルのアドレスを取得します。

于 2012-12-17T13:33:00.943 に答える
9

&&GNU C のラベル アドレス演算子を次に示します。

http://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html

int *q = &&i;

iラベルでなければなりません。iプログラムにラベルがありません。

ラベルの例:

int main(void)
{
    i:
    (void) 0;

     int i = 0;
     int *p = &i;
     int *q = &&i;
     return 0;
}

(void) 0;C のラベルはステートメントの前にのみ配置でき、宣言の前には配置できないため、ステートメントを追加しました。

于 2012-12-17T13:31:11.653 に答える
4

&は 2 つの方法で使用されます。まず、変数のアドレスを取得できます。

int *p = &i; // that's fine, p points to i's address

次に、「ビット単位」を実行するために使用されます。

int i = 1;     // 01
int j = 3;     // 11
int k = i & j; // 01

&&は論理演算子であり、「アドレスのアドレス」演算子ではありません。2 つの条件を一緒にチェックし、両方が真であることをアサートするために使用されます。

if (something && something_else)

編集:これをCおよびC ++としてタグ付けしたことに気づきました...これがCの質問である場合は、上記を参照してください。これが C++ の質問である場合は、次の点に注意してください&&

C++ ダブルアドレス演算子? (&&)


編集 2:&&ラベルのアドレスを取得するラベル値演算子としての別の使用法があります。

コンパイラはそれがあなたのやりたいことだと想定しているので、これがエラーメッセージの内容です:

ラベル値演算子 && は、そのオペランドのアドレスを返します。これは、現在の関数またはそれを含む関数で定義されたラベルでなければなりません。値は void* 型の定数であり、計算された goto ステートメントでのみ使用する必要があります。言語機能は C および C++ の拡張機能であり、GNU C で開発されたプログラムの移植を容易にするために実装されています。

int main()
{
   void * ptr1;
   label1: ...
   ptr1 = &&label1;

   ...

   if (...) {
      goto *ptr1;
   }
   ...
}
于 2012-12-17T13:31:38.610 に答える