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, makropaste
birleştirir iki argüman:
#define paste(front, back) front ## back
paste(name, 1)
simge oluşturur bu yüzdenname1
.
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
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
Teknik olarak, nasıl variadic fonksiyo...
Ne kadar Güzel Ve Şık uygulamaları Zam...
Ne kadar basit bir popup jQuery kullan...
Ne kadar basit makrolar platform/derle...
ne kadar basit bir python döngü parall...