创建可变宏/方法,打印所有变量的名称和值

Make variadic macro / method which prints all variables names and values

本文关键字:变量 打印 方法 创建      更新时间:2023-10-16

一个已经存在的宏在我的应用程序中获取可变数量的变量。
我想用这个宏,用name=value格式打印这些变量。

下面是一个小例子:

#define EXISTING_MACRO(...) < ??? >
int main()
int a = 0;
int b = 1;
int c = 2;
EXISTING_MACRO(a,b,c);

输出应该是:

a=0, b=1, c=2

我已经尝试过从宏中调用可变模板函数,并且我确实成功打印了变量值,但没有打印变量名称。(#x打印它们的地址,即使它不打印,它也可能只显示方法变量名,'f'):

#define SHOW(a) std::cout << #a << "=" << (a)
template<typename TF>
void write_err_output(std::ostream& out, TF const& f) {
    out << f << std::endl;
}
template<typename TF, typename ... TR>
void write_err_output(std::ostream& out, TF const& f, TR const& ... rest) {
    out << SHOW(f) << " ";
    write_err_output(out, rest...);
}

您可以通过一些技巧来做到这一点。这个hack不是很健壮,但是如果您将它用于调试目的,它应该是可以接受的。

思路是将整个可变宏参数字符串化,然后通过逗号进行标记,将标签序列分开。这要求所有可变参数都不包含逗号,如果它们都是变量名,则会出现这种情况,但没有办法要求这样做,实际上下面建议的代码将愉快地接受表达式,如所示。

#define SHOW(...) show(std::cout, #__VA_ARGS__, __VA_ARGS__)
template<typename H1>
std::ostream& show(std::ostream& out, const char* label, H1&& value) {
  return out << label << "=" << std::forward<H1>(value) << 'n';
}
template<typename H1, typename ...T>
std::ostream& show(std::ostream& out, const char* label, H1&& value, T&&... rest) {
  const char* pcomma = strchr(label, ',');
  return show(out.write(label, pcomma - label) << "="
                                               << std::forward<H1>(value)
                                               << ',',
              pcomma + 1,
              std::forward<T>(rest)...);
}
(live on coliru)

为简单起见,并避免使用std::string,我使用了标准的C strchr函数而不是c++库函数。我向所有被冒犯的人道歉。

对于宏不能这样做。您可以对单个变量(do{…因此,}while(0)很有用)。

#define MYPRINT(VarName) do{ 
   std::cout << #VarName "=" << VarName << std::endl;} while(0)

则使用MYPRINT(x);你可以考虑定义MYPRINT1MYPRINT19(可能是自动的,通过一些脚本)用于范围1到19。

如果使用最新的GCC,您可以使用MELT根据您的目的定制它,但我认为这不值得这样做(您将花费数周的时间来做这件事)。

你可以考虑用一些其他的预处理器(如gpp)或一些简单的脚本(如awk)预处理你的c++代码