SORU
19 EKİM 2008, Pazar


Bu uygulamaları ne ## operatör kadar basit ve göz önünde sorunlar?

Önceki sorularıma çok da belirtildiği gibi, K&R ile çalışıyorum, ve şu anda bu kadar basit oldum. Daha ilginç şeyler ve-biri; daha önce hiç C-Öğren önce çalışmalarıma gelen bir şey biliyordu; ## basit operatör. K&R göre:

Basit operatör ## gerçek bağlamak için bir yol sağlar makro genişleme sırasında bağımsız değişkenleri. Eğer parametre değiştirme metni ** 4, parametre bir bitişik gerçek argümanın yerini, ## ve boşluk etraftaki kaldırıldı ve sonuç tekrar taranır. Örneğin, makro paste birleştirir iki argüman:

#define paste(front, back) front ## back

paste(name, 1) simge oluşturur bu yüzden name1.

Nasıl ve neden birileri gerçek dünyada bu kullanmak istiyorsunuz? Kullanımı pratik örnekler ve dikkate ayrıntılar var mı?

GÜNCELLEME:

Brian R. Bondy cevabı kabul ettim, ama katkıda-ve umarım gelecekte daha fazla katkıda bulunacak herkese teşekkür etmek istiyorum. Burada her şey çok aydınlatıcı oldu, ve bu kavramı daha iyi anlamak yardımcı oldu bana. Yakın zamanda kullanacağım şüpheliyim, ama sadece ne, ama kullanılan-olduğunu; ve yaygın olarak anlaşılan-sadece bilmek son derece yararlıdır.

CEVAP
19 EKİM 2008, Pazar


Bir şeye dikkat edin ne zaman kullanıyorsun belirteç-yapıştır ('##') veya stringizing ('#') önişleme operatörler olduğunuz için kullanmak fazladan bir seviye yönlendirme için onlara düzgün çalışmıyor her zaman.

Bunu yapma ve öğeleri token yapıştırma operatörü geçirilen kendilerini makrolar, sonuçlar alırsınız ne istediğinizi muhtemelen değildir:

#include <stdio.h>

#define STRINGIFY2( x) #x
#define STRINGIFY(x) STRINGIFY2(x)
#define PASTE2( a, b) a##b
#define PASTE( a, b) PASTE2( a, b)

#define BAD_PASTE(x,y) x##y
#define BAD_STRINGIFY(x) #x

#define SOME_MACRO function_name

int main() 
{
    printf( "buggy results:\n");
    printf( "%s\n", STRINGIFY( BAD_PASTE( SOME_MACRO, __LINE__)));
    printf( "%s\n", BAD_STRINGIFY( BAD_PASTE( SOME_MACRO, __LINE__)));
    printf( "%s\n", BAD_STRINGIFY( PASTE( SOME_MACRO, __LINE__)));

    printf( "\n" "desired result:\n");
    printf( "%s\n", STRINGIFY( PASTE( SOME_MACRO, __LINE__)));
}

Çıkış:

buggy results:
SOME_MACRO__LINE__
BAD_PASTE( SOME_MACRO, __LINE__)
PASTE( SOME_MACRO, __LINE__)

desired result:
function_name21

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bryan Adams

    Bryan Adams

    30 Mart 2006
  • Muse

    Muse

    28 EYLÜL 2006
  • TechRax

    TechRax

    21 EYLÜL 2009