Próbuję dowiedzieć się, jak napisać makro, które przekaże zarówno ciąg znaków reprezentacji nazwy zmiennej, jak i samą zmienną do funkcji.
Na przykład biorąc pod uwagę następującą funkcję.
void do_something(string name, int val)
{
cout << name << ": " << val << endl;
}
Chciałbym napisać makro, więc mogę to zrobić:
int my_val = 5;
CALL_DO_SOMETHING(my_val);
Który wydrukowałby: my_val: 5
Próbowałem wykonać następujące czynności:
#define CALL_DO_SOMETHING(VAR) do_something("VAR", VAR);
Jednak, jak można się domyślić, wartość WARIANCJA wewnątrz cudzysłowów nie jest zastępowana, ale jest przekazywana jako literał ciągu „ZMIENNA”. Chciałbym więc wiedzieć, czy istnieje sposób na przekształcenie argumentu makra w sam literał ciągu.
Odpowiedzi:
Użyj
#
operatora preprocesora :#define CALL_DO_SOMETHING(VAR) do_something(#VAR, VAR);
źródło
Chcesz użyć operatora naciągania:
#define STRING(s) #s int main() { const char * cstr = STRING(abc); //cstr == "abc" }
źródło
Być może wypróbujesz to rozwiązanie:
#define QUANTIDISCHI 6 #define QUDI(x) #x #define QUdi(x) QUDI(x) . . . . . . unsigned char TheNumber[] = "QUANTIDISCHI = " QUdi(QUANTIDISCHI) "\n";
źródło
QUDI(x)
nie wystarczy.#define NAME(x) printf("Hello " #x); main(){ NAME(Ian) } //will print: Hello Ian
źródło
"Hello" #x"
(i#x "Hello"
) powoduje sklejanie sznurka bez spacji, co jest pożądane w niektórych przypadkach, więc jest to dość dobra odpowiedź."Hello " #x