【问题标题】:How to change macro function argument expansion ordering?如何更改宏函数参数扩展顺序?
【发布时间】:2014-10-23 09:01:48
【问题描述】:

我有以下代码:

#include <iostream>
#include <stdexcept>

#define TRACE_MACRO(EnterText) \
class CTrace \
{ \
public: \
CTrace() \
{ \
std::cout << EnterText;  \
} \
private:\
};

#define DO_TRACE TRACE_MACRO("[ENTER] " __FUNCTION__ "\r\n") CTrace trace

static void test()
{
    DO_TRACE;
}

int main(int, char**)
{
    DO_TRACE;
    test();
    return 0;
}

哪些输出:

[ENTER] main::CTrace::CTrace
[ENTER] test::CTrace::CTrace

如何编写宏,使__FUNCTION__ 首先展开,以便输出变为:

[ENTER] main
[ENTER] test

我试图创建一个名为 DO_TRACE2 的子宏来转发参数,但这会产生相同的输出。

如果这是不可能的,那么将编译时间子字符串文本以剥离字符串的 CTrace::CTrace 部分的宏怎么样?

编辑:请注意,我不想将指向编译时字符串的指针传递给此类,我希望对 std::cout 的调用看起来好像我实际上手动编写了 std::cout

【问题讨论】:

  • 是否需要在宏def中定义一个全新的类?
  • 根据C99__FUNCTION__不是宏,预处理器不理解“当前函数”的概念,因为它对C++语法或作用域一无所知,所以无法知道函数的名字。
  • @Jimmy 不,我只是希望对 std::cout 的调用使用 const 静态编译时间字符串,而不是指向编译时间字符串的指针,如果这有意义的话。

标签: c++ macros c-preprocessor


【解决方案1】:

未经测试,但这里有一个可能有效的简单重新排列:

#define TRACE_MACRO \
class CTrace \
{ \
public: \
CTrace(const char* text) \
{ \
std::cout << text;  \
} \
private:\
};

#define DO_TRACE TRACE_MACRO CTrace trace("[ENTER] " __FUNCTION__ "\r\n")

【讨论】:

  • 这可行,但我不想传递指向编译时间字符串的指针,我希望使用编译时间字符串本身调用 std::cout。我会更新问题以明确这一点
  • 为什么?阻止您使用此有效解决方案的更高级别目标是什么?
  • 原因是为了避免静态分析工具警告将 const char* 传递给格式字符串函数。因此,如果我可以使用宏给它一个字符串文字,那么这个警告就会消失。只有障碍是 FUNCTION 没有按预期工作。
  • 这里使用的格式字符串在哪里?这不是您的实际代码吗?您是否真的在使用 printf() 并且需要做一些特殊的事情来支持它,但还没有告诉我们?
  • 所以你试图让你的代码尽可能复杂......只是为了满足静态分析工具?大声笑!
【解决方案2】:

吉米问

是否需要在宏def中定义一个全新的类?

你回答:

@Jimmy 不,我只是希望调用 std::cout 使用 const 静态编译时间字符串而不是指向编译时间的指针 字符串,如果有意义的话。

那么为什么不直接放弃这个课程:

#define DO_TRACE std::cout << "[ENTER] " << __FUNCTION__ << "\r\n"

这将输出:

[ENTER] main 
[ENTER] test

并使用 const 静态编译时间字符串....

我可能错过了什么,告诉我,我会删除这个帖子......

顺便说一句,我使用来自http://www.compileonline.com/compile_cpp_online.php 的 GNU GCC 4.8.1 版编译了您帖子中的代码。它输出

[ENTER] CTrace 
[ENTER] CTrace

所以看起来 FUNCTION 宏被编译器以不同方式解析...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-23
    相关资源
    最近更新 更多