如何更改宏函数参数展开顺序
How to change macro function argument expansion ordering?
我有以下代码:
#include <iostream>
#include <stdexcept>
#define TRACE_MACRO(EnterText)
class CTrace
{
public:
CTrace()
{
std::cout << EnterText;
}
private:
};
#define DO_TRACE TRACE_MACRO("[ENTER] " __FUNCTION__ "rn") 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<lt;"main";
未测试,但这里有一个可能有效的简单重排:
#define TRACE_MACRO
class CTrace
{
public:
CTrace(const char* text)
{
std::cout << text;
}
private:
};
#define DO_TRACE TRACE_MACRO CTrace trace("[ENTER] " __FUNCTION__ "rn")
Jimmy问
有必要在宏def中定义一个全新的类吗?
你回答说:
@吉米没有,我只是想用const调用std::cout静态编译时字符串,而不是指向编译时的指针字符串,如果有意义的话。
那么,为什么不放弃这门课呢:
#define DO_TRACE std::cout << "[ENTER] " << __FUNCTION__ << "rn"
这将输出:
[ENTER] main
[ENTER] test
并使用const静态编译时字符串。。。。
我可能错过了什么,告诉我,我会删除这篇帖子。。。。
顺便说一句,我使用GNUGCC版本4.8.1编译了你的文章中的代码http://www.compileonline.com/compile_cpp_online.php.输出
[ENTER] CTrace
[ENTER] CTrace
看起来FUNCTION宏是由编译器以不同的方式解析的。。。
相关文章:
- 函数调用中参数的顺序重要吗
- C++部分概念 id:显式模板规范顺序/第一个参数的特殊状态的原因是什么?
- lambda 作为接受其他参数的参数的初始化顺序
- 运算符 new 的执行顺序和构造函数的参数
- 如何检查参数包是否具有执行顺序中的确切类型
- std::bind() 参数列表中函子的执行顺序(可能与函数参数的求值顺序无关)
- 构造函数中没有参数的对象类成员按什么顺序初始化?
- 如何实现对参数顺序不可知的std::same_as的广义形式(即对于两个以上的类型参数)
- 用作成员构造函数参数的函数的求值顺序
- C++17的可选和可变顺序函数参数
- 委派的 ctor 是否受参数计算顺序的影响?
- x64 函数调用参数推送/移动顺序 (MSVC)
- 函数参数计算顺序与 Lambda 捕获评估顺序
- 反转模板(整数)参数的顺序
- 大括号和括号之间的参数计算顺序
- 约束模板参数顺序的更简单方法
- C++ 更改基于参数设置的默认顺序
- 重载运算符以允许C++中参数的不同顺序
- 正确对齐内存模板,参数顺序不变
- 为具有默认值的非顺序参数函数创建启动器