【发布时间】:2019-12-24 21:55:58
【问题描述】:
运行这个:
#define STATIC_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__)
template< int PathLength >
constexpr const int startfindlastslash(const char (&path)[PathLength]) {
return PathLength;
}
int main(int argc, char const *argv[])
{
STATIC_ASSERT( startfindlastslash( "cppdebugger/test_debugger.cpp" ) == 11 );
}
你得到了:
-
g++ -o main.exe --std=c++14 test_debugger.cpptest_debugger.cpp: In function ‘int main(int, const char**)’: test_debugger.cpp:1:28: error: static assertion failed: startfindlastslash( "cppdebugger/test_debugger.cpp" ) == 11 #define STATIC_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__) ^ test_debugger.cpp:10:5: note: in expansion of macro ‘STATIC_ASSERT’ STATIC_ASSERT( startfindlastslash( "cppdebugger/test_debugger.cpp" ) == 11 ); ^~~~~~~~~~~~~ -
clang++ -Xclang -ast-print -fsyntax-only --std=c++14 test_debugger.cpp > main.exetest_debugger.cpp:10:5: error: static_assert failed due to requirement 'startfindlastslash("cppdebugger/test_debugger.cpp") == 11' "startfindlastslash( \"cppdebugger/test_debugger.cpp\" ) == 11" STATIC_ASSERT( startfindlastslash( "cppdebugger/test_debugger.cpp" ) == 11 ); ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ test_debugger.cpp:1:28: note: expanded from macro 'STATIC_ASSERT' #define STATIC_ASSERT(...) static_assert(__VA_ARGS__, #__VA_ARGS__) ^ ~~~~~~~~~~~ 1 error generated.
编译器不会告诉它应该得到哪个值,它只是说这个值不相等。
【问题讨论】:
-
我知道它在我的示例中打印的值是固定的,因为我使用了通用宏。但不知何故可以修复这个宏以显示实际值?
-
我认为
static_assert不可能。您可以定义一个使用template <int c> struct V {};的宏并尝试复制该结构,如果c值不匹配,它将生成编译时错误(例如无法从V<30>转换为@987654330 @)。宏需要 2 个参数:预期值和实际值,由于它依赖于编译器诊断,结果可能因编译器而异。 -
@Phil1970,这似乎是个好主意!你能写一个答案吗? (很遗憾他们设计了标准
static_assert有这个问题) -
我可能在 15 年前写了这样的代码,然后
static_assert被添加到语言中。我不记得确切的实现。在实践中,static_assert工作得很好,如果您在猜测该值时遇到问题,您始终可以通过打印实际值来调试应用程序。或者使用通常会给出实际值和预期值的单元测试框架。
标签: c++ templates c++14 c++17 static-assert