如何从中获取/打印变量名称?我正在使用arduino Stream打印到控制台。
#ifndef any_h
#define any_h
#if ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
struct any {
any(Stream& s):serial(s){}
template <class T>
void print(const T& msg)
{
getName(class T);
serial.print(msg);
}
template <class A, class... B>
void print(A head, B... tail)
{
print('{');
print(head);
print(tail...);
}
private:
Stream& serial;
};
#endif
用法:
any A(Serial);
int myInt =34;
float myFloat = 944.5555f;
String myString = " this string";
A.print(myInt,myFloat,myString);
当前输出
34944.555 this string
我正在尝试使用相同的用途/访问权限或类似内容:Demo。
{"variableName":value,"variableName":value}
// That is in this case:
{myInt:34,myFloat:944.55,myString: this string}
我已经尝试过:
#define getName(x) serial.print(#x)
void print(const T& msg)
{
getName(msg);
//getName(class T);
serial.print(msg);
}
output : msg34msg944.555msg this string
答案 0 :(得分:1)
您可以使用宏与stringify preprocessor结合使用:
#include <stdio.h>
#define PRINT_NAME(name) print_name(#name, (name))
void print_name(char *name, char* value) {
printf("name: %s ---> value: %s\n", name, value);
}
int main (int argc, char* argv[]) {
char* var1 = 'my var 1';
char* var2 = 'my new var 2';
PRINT_NAME(var1);
PRINT_NAME(var2);
return 0;
}
name: var1 --> value: my var 1
name: var2 --> value: my new var 2
我希望这会有所帮助:)
答案 1 :(得分:0)
C ++没有反射,所以你只能使用宏,例如:
#include <iostream>
#define STRINGIFY_IMPL(X) #X
#define STRINGIFY(X) STRINGIFY_IMPL(X)
#define VARIABLE_NAME(X) STRINGIFY(X)
#define VARIABLE_VALUE(X) X
int main()
{
double d = 3.141;
std::cout << VARIABLE_NAME(d) << ": " << VARIABLE_VALUE(d) << '\n';
return 0;
}
(VARIABLE_NAME
和VARIABLE_VALUE
并非真正需要,您也可以使用std::cout << STRINGIFY(d) << ": " << d << '\n';
)。
当然,您可以将这一切组合成一个超级宏(使用上面的宏):
#include <iostream>
#include <string>
#define STREAM_NAME_VALUE(str, X) str << '{' << STRINGIFY(X) << ':' << X << '}'
int main()
{
int myInt =34;
float myFloat = 944.5555f;
std::string myString = " this string";
STREAM_NAME_VALUE(std::cout, myInt);
std::cout << '\n';
STREAM_NAME_VALUE(std::cout, myFloat);
std::cout << '\n';
STREAM_NAME_VALUE(std::cout, myString);
std::cout << '\n';
return 0;
}