【问题标题】:Log the text of an expression and its result without C preprocessor在没有 C 预处理器的情况下记录表达式的文本及其结果
【发布时间】:2015-04-01 01:01:08
【问题描述】:

我在 C/C++ 中经常使用这个宏:

#define MYLOG(x) (std::cout << "Value of " << #x << " is: " << x << std::endl);

它是这样使用的:

int x = 1;
int y = 2;
MYLOG(x+y);

结果是这样的:

Value of x+y is: 3

我还没有用任何不使用 C 预处理器的语言复制它。可以用其他语言吗?我希望能够在其他地方开始使用它。注意: eval 不计算在内。我想在我的代码中看到表达式,而不是字符串,这样我仍然可以进行语法高亮和自动完成。

【问题讨论】:

  • 我不认为 C/C++ 标记器预处理器运算符 # 存在于其他任何地方。
  • 我认为这没什么价值。日志应该显示值是什么,而不是如何计算(log("square: ", width*height)log("width*height", width*height)),因为这是一个实现细节。
  • @user694733:它实际上非常有用,特别是对于失败断言中的消息,您想知道表达式和不符合预期的值。也就是说,除非您准备引入额外的预处理阶段,否则要求语言无关的解决方案并没有多大意义,在这种情况下,您实际上可以使用 C/C++ 预处理器,或者像 M4 这样更强大的东西,但问题需要工具建议与 SO 无关
  • 你可以在 Lisp 中完成。
  • @TonyD 虽然可能有一些我不知道的特殊情况,但总的来说,知道发生了什么以及在哪里更有用。无论如何都可以在代码中找到表达式(除非它是动态的,但无论如何您可能都在使用 eval )。在我看来,描述性信息比模糊表达更有助于定位问题。但正如你所说,这个问题目前的形式并不能真正回答,所以试图猜测这个问题的实际用例是没有意义的。

标签: c++ c logging language-agnostic c-preprocessor


【解决方案1】:

不,在 C 和 C++ 中,编译器都会删除符号信息。 #x 在预处理器中创建一个字符串,编译器会保存字符串。

其他具有更强反射能力的语言可能会提供对表达式进行反射的能力。特别是,纯解释型语言只使用字符串表示,因此它们可以简单地打印出来。但是,这就是您反对eval 的地方。我不明白为什么,有些语言是 100% eval

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    • 2015-12-25
    • 2012-06-05
    相关资源
    最近更新 更多