2017-12-15 216 views
5

Cevabın hayır olduğunu düşünüyorum ve genellikle kaynak koddan geçmekte zorluk çekmiyorum, fakat C/C++ için biraz yeniyim ve bu sabitin nerede bildirildiğini bulamıyorum.Hiç tanımlanmayan/bildirilmeyen bir C sabitine başvurmanın bir yolu var mı?

için The hiredis-vip client library for Redis numaralı telefonu arıyorum. Bunun için bir github/google araması yaptım ve beş oluşum için tam olarak iki dosya elde ettim. Ayrıca kaynak koddaki dize için grep çalıştım.

$ grep -rnw ./ -e "CMD_REQ_REDIS_MGET" 
./command.c:241: case CMD_REQ_REDIS_MGET: 
./command.c:574:     r->type = CMD_REQ_REDIS_MGET; 
./hircluster.c:3257:  if (command->type == CMD_REQ_REDIS_MGET) { 
./hircluster.c:3446:  if (command->type == CMD_REQ_REDIS_MGET) { 
./hircluster.c:3480: if (command->type == CMD_REQ_REDIS_MGET) { 

Kaynak kod hiçbir ikili içermiyor ve kendi kendine yeterli olması gerekiyordu. Redis ile ilgili harici kaynaklardan herhangi bir kütüphane içermez ve bu yüzden birkaç saatliğine kafam karışmış olur.

Bilmem gerekmesinin nedeni, tıpkı bunun gibi başka bir sabit eklemeyi denemem ve beyanın bulunamadığı konusunda hatalar yapmaya devam ediyorum, bu yüzden burada bir kara büyü olup olmadığını merak ediyorum. Sadece farkında olmadığım C.

DÜZENLEME: Bu kodun aslında olduğu gibi derleneceğini belirtmek istedim.

+0

grep'i uygun seviyede yaptığınızdan emin misiniz? Bu tür tanımlar genellikle .h dosyasındadır. –

+0

@ Jean-FrançoisFabre Gitme repo –

cevap

10

Daha önce bildirilmemiş bir sabit kullanmak mümkün değildir. Ama bu durumda, sabit beyan edildi, ancak önemsiz değil.

bu değerler belirteç yapıştırma (eskilerini birleştirerek yeni tanımlayıcılar oluşturur ## operatörü) kullanılarak command.h bir makro tanımlanır çünkü (o başlık dosyalarında olmalıdır) her yerde dize bulmuyorum:

böylece CMD_ + son ekinizi bulamazsınız. Sonra biraz büyü (makro adı muhtemelen bir noktada yeniden tanımlanır) tarafından, aşağıdakiler tüm unsurları tanımlar:

#define CMD_TYPE_CODEC(ACTION)                  \ 
    ACTION(UNKNOWN)                    \ 
    ACTION(REQ_REDIS_DEL)     /* redis commands - keys */       \ 
    ACTION(REQ_REDIS_EXISTS)                  \ 
    ACTION(REQ_REDIS_EXPIRE)                  \ 
    ACTION(REQ_REDIS_EXPIREAT)                 \ 
    ACTION(REQ_REDIS_PEXPIRE)                  \ 
    ACTION(REQ_REDIS_PEXPIREAT)                 \ 
    ACTION(REQ_REDIS_PERSIST)                  \ 
    ACTION(REQ_REDIS_PTTL)                  \ 
    ACTION(REQ_REDIS_SORT)                  \ 
    ACTION(REQ_REDIS_TTL)   

Böyle makrolar kopyala/yapıştır önlemek için çok faydalıdır, ancak çalıştığınız cehennemdesin grep kullanarak kodda yolunuzu bulun.

+0

Oh kökünde bunu gerçekleştiriyorum Oh, mümkün olabileceği gibi bir şey bilmiyordum .. C makroları hakkında daha fazla araştırma yapacağım. Bunu benim için aradığına gerçekten minnettarım! –

+2

'##' * jeton yapıştırma * operatörüdür (en kısa sürede kabul edeceğim). Tek bir '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' * * '' * * * * * * * * * * * * * * * * * * * * * * (bu terimi standardı kullandığını sanmıyorum) –

+0

@KeithThompson evet, isimlerle pek iyi değilim. Ben düzenleyeceğim –