SORU
12 HAZİRAN 2014, PERŞEMBE


Nasıl C ön işlemci dairesel bağımlılıkları ele?

C ön işlemci dairesel bağımlılıkları nasıl işlediğini öğrenmek istiyorum (#tanımlar). Bu benim programdır

#define ONE TWO 
#define TWO THREE
#define THREE ONE

int main()
{
    int ONE, TWO, THREE;
    ONE = 1;
    TWO = 2;
    THREE = 3;
    printf ("ONE, TWO, THREE = %d,  %d, %d \n",ONE,  TWO, THREE);
}

Burada basit çıktı. Çıktı gibi olmasının nedenini anlamak mümkün değil. Basit bu durumda alır çeşitli adımları bilmek, aşağıdaki çıktıyı vermek istiyorum.

# 1 "check_macro.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "check_macro.c"

int main()
{
 int ONE, TWO, THREE;
 ONE = 1;
 TWO = 2;
 THREE = 3;
 printf ("ONE, TWO, THREE = %d,  %d, %d \n",ONE, TWO, THREE);
}

Linux 3.2.0-49-genel-değişen bu programı çalıştıran ve gcc 4.6.3 sürümü (Ubuntu/4.6.3-1ubuntu5 Linaro) derleme yapıyorum.

CEVAP
12 HAZİRAN 2014, PERŞEMBE


Basit bir makro genişletilmiş edilirken, makro adı açılmamıştır. Sembollerin üçü de kendilerini olarak tanımlanır:

ONE -> TWO -> THREE -> ONE (not expanded because expansion of ONE is in progress)
TWO -> THREE -> ONE -> TWO (        "                         TWO      "        )
THREE -> ONE -> TWO -> THREE (      "                         THREE    "        )

Bu davranış tarafından ayarlanır ve mezhep;6.10.3.4 C standart (bölüm numarası C11 taslak, ancak bildiğim kadarıyla, ifade ve numaralandırma bölümü değişmeden beri C89). Bir makro adı karşılaşıldığında, tanımı (# ## basit operatörleri ele alınmasının yanı sıra işlev benzeri makrolar için parametreler) ile değiştirilir. O zaman sonuç daha makrolar (dosyanın geri kalanını bağlamında) yeniden tarandı

Eğer makro adı değiştirilen 2/ Bu sırasında yedek liste tarama (kaynak dosyanın ön simgeleri geri kalanı hariç) bulundu, yerini değil. Herhangi bir iç içe yedek makro adı değiştirilen karşılaşırsanız ayrıca, yerine&üssün;

Yan yinelemeli çağrı nedeniyle değiştirilmemiştir olan herhangi bir simge etkili olduğunu söylemeye devam ediyor"": hiç değiştirilecektir: . dondurulmuş

&; Bu nonreplaced makro adı belirteçleri önişleme daha sonra (tekrar)makro adı token önişleme aksi almıştır ki bağlamlarda incelenir varsa bile artık daha fazla yenileme için kullanılabilir üssün.

Son cümle nadiren atıfta bulunduğu durumun pratik geliyor, ama burada aklıma gelen en basit örnek

#define two one,two
#define a(x) b(x)
#define b(x,y) x,y
a(two)

Sonuç one, two. two a two tamamen genişletilmiş olarak işaretlenmiş genişletilmiş değiştirme sırasında one,two genişletilir. Daha sonra b(one,two) genişletilir. Bu daha genişletilmiş değildir artık ** 16 yaşında, ama donmuş olan two değiştirilmesi bağlamında.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Anthony Le

    Anthony Le

    10 EKİM 2006
  • AverageBroTV

    AverageBroTV

    20 Mart 2013
  • BumbleDroid

    BumbleDroid

    18 EKİM 2010