c++ - 使用较旧的 C++ 实现在编译时检查一些编译时定义

标签 c++ compile-time static-assert compile-time-constant c++builder-6

在处理大型遗留代码库时,我今天怀疑有重复的定义,但这种依赖性对我来说并不明显,因为它依赖于大量的编译时计算。

enum { MAX_ITEMS = 4 }; // defined somewhere in my code universe
enum { ITEMS_MAX = COMPLICATED_CALCULATIONS }; // somewhere else

我让编译器说话时,我记得有一些类似的sizeof问题。

我通常会在代码中(在 IDE 中)放置一些像这样的临时公式,然后按 [Alt]+[F9]:

void check() {
    char bla[MAX_ITEMS == ITEMS_MAX]; // compiler-error shows difference
    // ...but it causes a compiler warning about bla being never used
}

...这只是因为我的编译器 (Borland C++ 5.6.4) 延迟计算具有非文字维度的数组的 typedef:

typedef char bla[0];       // immediate compiler error
typedef char bla[0 != 0];  // obvious, but no compiler error HERE

有没有一种非常容易内存的方法来进行这样的检查? 而且,请不要责怪一个勇敢的老编译器;-)

最佳答案

这有效:

#define STATIC_ASSERT(x) typedef char foo[(x) ? 1 : -1];

我实际上使用了从Boost借用的以下设置,这样做的目的是为每个foo提供自己的行号(否则可能会发生多重定义错误):

#define BOOST_JOIN( X, Y ) BOOST_DO_JOIN( X, Y )
#define BOOST_DO_JOIN( X, Y ) BOOST_DO_JOIN2(X,Y)
#define BOOST_DO_JOIN2( X, Y ) X##Y
#define STATIC_ASSERT(x) \
    typedef char BOOST_JOIN(violation_on_line_,__LINE__) [(x) ? 1 : -1];

关于c++ - 使用较旧的 C++ 实现在编译时检查一些编译时定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26058521/

相关文章:

c++ - 如何在 Visual Studio 中查看 static_assert 的 'failure source'?

c++ - 我如何静态断言 static_cast 是 noexcept?

c++ - 系统时钟和辅助时钟的区别

c++ - 在偶数个元素的情况下打印链表的中间

c++ - opencv sgbm 在对象边缘产生异常值

c++ - 在 Visual C++ 可执行文件中输出编译时间戳?

c++ - 为什么编译时间的持续时间至关重要?

c++ - 一些 const char * 在编译时不可用?

c++ - 如何将模板参数限制为仅指针或随机访问迭代器?

c++ - boost.asio boost::asio::ip::tcp::resolver::async_resolve 不起作用