小编Hor*_*ing的帖子

__COUNTER__如何在此处导致ODR违规?

此演示在大约0时19分○○秒,安德烈Alexandrescu的解释他的执行SCOPE_EXIT宏.他ScopeGuard在堆栈上创建了一个在销毁时执行lambda 的对象:

#define ANONYMOUS_VARIABLE(str) \
    CONCATENATE(str, __COUNTER__)

namespace detail {
    enum class ScopeGuardOnExit {};
    template <typename Fun>
    ScopeGuard<Fun>
    operator+(ScopeGuardOnExit, Fun&& fn) {
        return ScopeGuard<Fun>(std::forward<Fun>(fn));
    }
}

#define SCOPE_EXIT \
    auto ANONYMOUS_VARIABLE(SCOPE_EXIT_STATE) \
    = ::detail::ScopeGuardOnExit() + [&]()
Run Code Online (Sandbox Code Playgroud)

到目前为止,众所周知(他甚至在他的幻灯片中说这是一顶旧帽子).用法如下:

void foo()
{
    SCOPE_EXIT{ printf("foo exits"); };
}
Run Code Online (Sandbox Code Playgroud)

但是在01:04:00,Chandler Carruth声称,在内__COUNTER__联函数中使用宏时,使用宏创建"匿名"名称会导致ODR违规.这可能是真的吗?该宏仅用于创建局部变量名称,而不是类型名称或其他内容,因此如何导致ODR违规?

c++ one-definition-rule c-preprocessor

10
推荐指数
1
解决办法
217
查看次数

标签 统计

c++ ×1

c-preprocessor ×1

one-definition-rule ×1