Makro değişkeni dize değişmezi olarak nasıl kullanılır?


91

Değişken isminin hem bir dize değişmez gösterimini hem de değişkenin kendisini bir işleve geçirecek bir makroyu nasıl yazacağımı bulmaya çalışıyorum.

Örneğin aşağıdaki işlev verildi.

void do_something(string name, int val)
{
   cout << name << ": " << val << endl;
}

Bunu yapabilmek için bir makro yazmak istiyorum:

int my_val = 5;
CALL_DO_SOMETHING(my_val);

Hangisi çıktılanır: my_val: 5

Aşağıdakileri yapmayı denedim:

#define CALL_DO_SOMETHING(VAR) do_something("VAR", VAR);

Ancak, tahmin edebileceğiniz gibi, tırnak içindeki VAR değiştirilmez, sadece "VAR" dizesi olarak aktarılır. Bu yüzden makro argümanının bir dizgeye dönüştürülmesinin bir yolu olup olmadığını bilmek isterim.


Bunu nasıl kullanmaya çalışıyorsun?
chris

Yanıtlar:



28

Çekme operatörünü kullanmak istiyorsunuz:

#define STRING(s) #s

int main()
{
    const char * cstr = STRING(abc); //cstr == "abc"
}

9

Belki bu çözümü denersiniz:

#define QUANTIDISCHI 6
#define QUDI(x) #x
#define QUdi(x) QUDI(x)
. . . 
. . .
unsigned char TheNumber[] = "QUANTIDISCHI = " QUdi(QUANTIDISCHI) "\n";

Bu soruya nasıl cevap veriyor veya nasıl yardımcı oluyor?
jirigracik

1
@jirigracik - Diğer yanıtların aksine, makro genişletmenin dizi sunumunu da elde etmenizi sağlar
grepcake

3
Sadece sahip olmanın neden QUDI(x)yeterli olmadığını açıklamanın faydalı olacağını düşünüyorum .
LRDPRDX

8
#define NAME(x) printf("Hello " #x);
main(){
    NAME(Ian)
}
//will print: Hello Ian

Tam olarak emin değilim, ama görünüşe göre "Hello" #x"(ve #x "Hello") ipin boşluksuz olarak birbirine yapıştırılmasına neden oluyor, ki bu bazı durumlarda istenen şey, bu yüzden bu oldukça iyi bir cevap.
Smar

1
@Smar Sabit dizeden sonra bir boşluk bıraktığınızdan emin olun Merhaba: "Hello " #x
jack

Tamam ben :) değerli bilgi parçalarının beri siz de cevap o düzenlemeniz gerekir, öyle düşünmüştüm
Smar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.