【问题标题】:CompileTimeChecker from Modern C++ Design not working as expectedModern C++ Design 中的 CompileTimeChecker 未按预期工作
【发布时间】:2011-04-25 11:33:14
【问题描述】:

我最近开始阅读 Andrei Alexandrescu 的 Modern C++ Design。阅读编译时断言后,我尝试了以下代码:

模板 struct CompileTimeChecker { CompileTimeChecker(...){}; }; 模板 struct CompileTimeChecker{}; #define STATIC_CHECK(expr, msg) \ {\ 类 ERROR_##msg{}; \ (void)sizeof(CompileTimeChecker((ERROR_##msg()))); /*第 1 行*/ } 主函数() { STATIC_CHECK(sizeof(char)>sizeof(int),TypeTooNarrow); /*第2行*/ STATIC_CHECK(sizeof(char)

由于第 2 行,该代码不应编译,但编译正常。如果我将第 1 行更改为

(void)(CompileTimeChecker((ERROR_##msg()))); /*第 1 行*/ }

新的 CompileTimeChecker((ERROR_##msg())); /* 第 1 行 */ }

它按预期工作。没看懂。

【问题讨论】:

  • 关闭另一个作为重复。让这个打开。
  • @Paul R :我认为@Saurabh 两次发布了相同的问题(我认为是错误的),另一个已经被关闭作为这个问题的副本,现在考虑到这个问题你正在关闭这个被别人骗了。
  • @Prasoon:当我投票关闭此副本时,两者都仍然打开 - 通常较新的副本已关闭,但我想只要只剩下一个就没有关系

标签: c++ templates compile-time


【解决方案1】:

【讨论】:

  • @Nikolai:行得通。在那个代码中,需要什么 (void)Error_##msg;
  • 第二个语句在那里,我猜,所以编译器不会抱怨未使用的变量。
  • 好的。您对我实际提出的问题有什么看法吗?
  • GCC 4.2.1 这么说:error: invalid application of ‘sizeof’ to a function type 关于main() 中的两行,即扩展宏被解释为函数声明。这也是我链接到的代码中的 cmets 所建议的。您的编译器可能只是作弊并跳过了(void)sizeof(...); 行。此外,Loki 库——本书中的所有代码等等——在本书写作之时还不能被任何现有的编译器完全编译。
【解决方案2】:

从 C++11 开始,最好使用 static_assert 而不是这种技术。 现代 C++ 设计 中描述的许多内容现在已被标准语言或库功能所取代。不过,它(可能)仍然值得一读。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    相关资源
    最近更新 更多