c++宏连接在gcc下不能工作
c++ macro concatation not worked under gcc
#include <iostream>
void LOG_TRACE() { std::cout << "reach here"; }
#define LOG_LL_TRACE LOG_TRACE
#define LL_TRACE 0
#define __LOG(level) LOG_##level()
#define LOG(level) __LOG(##level)
int main()
{
LOG(LL_TRACE);
return 0;
}
代码在Visual Studio下工作,但是report: test.cpp:13:1: error: paste "("answers"LL_TRACE"没有给出一个有效的预处理令牌。
我该如何修复它?
ps:宏扩展应该是LOG(LL_TRACE) --> __LOG(LL_TRACE) --> LOG_LL_TRACE()。
ps:假设LL_TRACE必须有一个0值,不要删除它
有两个原因导致这段代码不能在g++上编译:首先,你引用的错误是因为你想要这样:
#define LOG(level) __LOG(level)
注意没有##
。这些哈希符号的意思是连接,但您没有连接任何东西。只是转发一个参数。
#define LL_TRACE 0
这一行意味着您最终调用LOG(0),它扩展为未定义的LOG_0。
应该是:
#define LOG(level) __LOG(level)
:
#include <iostream>
void LOG_TRACE() { std::cout << "reach here"; }
#define LOG_LL_TRACE LOG_TRACE
#define __LOG( level ) LOG_##level()
#define LOG(level) __LOG(level)
int main()
{
LOG( LL_TRACE );
return 0;
}
相关文章:
- 为什么 decltype(declval()<T>.func()) 可以工作,而 decltype(&T::func) 不能工作?
- 为什么带有 const 关键字的构造函数可以工作,而没有它就不能工作?
- 为什么函数 sleep() 在 klee 执行 Objectfile 时不能工作?
- 为什么这段代码不能工作
- 向下转换到子类的问题,多态不能工作
- c++将字符串转换为char不能工作
- 为什么这个c++成员初始化列表不能工作?
- 为什么没有_Remove_reference, std::move()不能工作
- 为什么c++ Lambda表达式不能工作
- 为什么这个c++链接不能工作?(OSX小牛)
- 为什么cin.getline()不能工作(c++)
- c++类不能工作
- 为什么c++标准库不能工作?
- 为什么这个用于在c++ 11和TR1之间切换的预处理器宏不能工作?
- 什么可能导致我们的应用程序不能工作?c++
- c++宏连接在gcc下不能工作
- 具有可变范围的Std::vector不能工作
- 从c++程序创建tar.gz-archive不能工作
- 为什么main()函数之后的类定义不能工作
- 为什么元组不能工作?