对于相同的static_assert消息,我应该依赖MACROS吗?

时间:2013-12-19 17:31:01

标签: c++ c++11 macros string-literals static-assert

static_assert具有以下语法,表明需要字符串文字。

  

static_assert(bool_constexpr,字符串文字);


由于在编译时无法观察到字符串的实例,因此以下代码无效:

const std::string ERROR_MESSAGE{"I assert that you CAN NOT do this."};
static_assert(/* boolean expression */ ,ERROR_MESSAGE);

我的代码中都有静态断言,它说的是相同的错误消息。 由于需要字符串文字,最好用MACRO替换所有重复的字符串文字,还是有更好的方法?

// Is this method ok? 
// Should I hand type them all instead?
// Is there a better way?

#define _ERROR_MESSAGE_ "danger"

static_assert(/* boolean expression 1*/ ,_ERROR_MESSAGE_);
//... code ...
static_assert(/* boolean expression 2*/ ,_ERROR_MESSAGE_);
//... code ...
static_assert(/* boolean expression 3*/ ,_ERROR_MESSAGE_);

1 个答案:

答案 0 :(得分:1)

在C ++中,你应该将常量定义为宏。将其定义为常量。这就是常量的用途。

此外,以下划线后跟大写字母的名称(例如_ERROR_MESSAGE_)将保留给实现。

那就是说, ,最好将静态断言用于宏,以确保正确的字符串参数并支持可能没有的编译器static_assert,但是这个宏不是C样式常量:它将表达式作为参数,并将该表达式作为字符串消息提供。

这是我当前的<static_assert.h>

#pragma once
// Copyright (c) 2013 Alf P. Steinbach

// The "..." arguments permit template instantiations with "<" and ">".

#define CPPX_STATIC_ASSERT__IMPL( message_literal, ... ) \
    static_assert( __VA_ARGS__, "CPPX_STATIC_ASSERT: " message_literal  )

#define CPPX_STATIC_ASSERT( ... ) \
    CPPX_STATIC_ASSERT__IMPL( #__VA_ARGS__, __VA_ARGS__ )

// For arguments like std::integral_constant
#define CPPX_STATIC_ASSERT_YES( ... ) \
    CPPX_STATIC_ASSERT__IMPL( #__VA_ARGS__, __VA_ARGS__::value )

正如您所看到的,即使编译器确实有static_assert,也会涉及一些细微之处。