Bir mühendislik spesifikasyon belgesindeki elemanlarla aynı şekilde adlandırılan birçok değişken var, bu yüzden ismin dize versiyonu da kullanışlıdır.C/C++ macro argüman olarak genişletiliyor, argüman olarak argüman
#define MACRO(a) a, #a
Tipik kullanım şöyledir::
void someFunction(int a, const char *name);
someFunction(MACRO(meaningfully_named_variable));
sorum üç bölümden oluşmaktadır:
- daha iyi bir yolu var mı
Kendimi böyle çok makro kullanarak bulmak Bunu yapıyor?
- Benzer bir makro, Boost veya diğer kütüphanelerde kullanılabilir mi?
- Değilse, açık ve kullanışlı hale getirmek için bunu nasıl geliştirebilir ve yeniden adlandırabilirim?
düzenleme yukarıda az bir örnek söz konusu olmalıdır. İşlev başka parametrelere sahip olabilir ve adlandırılmış varlık bir veri üyesi veya belki de bir fonksiyonun kendisi olabilir.
C++ için düşündüğüm başka bir uzantı, makronun içeriğini alabilen bir sınıf NamedRef
.
template <typename T>
struct NamedRef
{
NamedRef(T *t, const char *name) : t(t), name(name) { }
T *t;
const char *name;
};
template <typename T>
NamedRef<T> namedRef(T &t, const char *name)
{
return NamedRef<T>(&t, name);
}
#define WITH_NAME(a) a, #a
// more sophisticated usage example
void otherFunction(double, NamedRef<int>, bool);
otherFunction(0.0, namedRef(object.WITH_NAME(meaningful_member_name)), false);
Tek yapmam gereken makro için daha açıklayıcı bir ad seçmektir, örn. 'WITH_NAME() '. –
@MarkRansom'un önerdiği şeyi yapın. Cevabım "iyi" demenin uzun bir yoluydu ve Boost'un "BOOST_STRINGIZE (X)" adlı bir makrosu var. – AusCBloke