【问题标题】:How does #error in C/C++ work?C/C++ 中的#error 是如何工作的?
【发布时间】:2010-05-08 21:02:55
【问题描述】:

我从 # 猜测它只是一个编译时实用程序。如何在 C/C++ 程序中使用它?

在互联网上没有找到太多关于它的信息。任何链接都会有所帮助。

【问题讨论】:

    标签: c++ c c-preprocessor


    【解决方案1】:

    它会导致编译器(或预处理器)输出错误消息。在 C++ 中,它还会呈现格式错误的翻译单元(即,它会导致编译失败)。

    如果您有多个可以定义的宏并且您想确保只定义了它们的某些组合,您可以使用#error 在定义无效组合时导致编译失败。

    如果您想确保某些代码块永远不会被编译(无论出于何种原因),它也很有用。

    【讨论】:

    • “仅定义了某些宏组合”是什么意思。你能举个例子吗?谢谢。
    • @cambr:例如,如果您有两个宏,DO_XDO_Y,并且您希望确保一次只设置一个,您可以将 #error 指令包装在#if (defined DO_X) && (defined DO_Y) 块。
    • @cambr:假设您的公司销售 Slicer™ 和 Dicer™。两种产品都使用blade.c,但它们通过构建系统传递不同的宏以实现稍微不同的功能。那么你可以使用#if SLICING … #elif DICING … #else #error No functionality selected by makefile.
    【解决方案2】:

    有助于检查编译器设置以及验证宏值组合。一些随机的例子:

    #if !defined(_DLL)
    #  error This code will only work properly when compiled with /MD
    #endif
    
    #if _WIN32_WINNT < 0x502
    #  error Sorry, Windows versions prior to XP SP2 are not supported
    #endif
    
    #if defined(_APPLE) && defined(_LINUX)
    #  error Conflicting operating system option selected, choose one.
    #endif
    

    【讨论】:

    • 你真的会在实践中处理最后一个吗?不死脑筋,不使用无意义的编译器标志不是用户的责任吗?您无法检查所有内容...
    • 这只是一个例子。当您接到太多的支持电话时,您往往会添加这些内容。例如,Boost 无处不在。
    【解决方案3】:

    这里是 Gnu 预处理器文档的链接,解释了 #error#warning 指令:http://gcc.gnu.org/onlinedocs/cpp/Diagnostics.html

    特别是:

    指令#error 导致 预处理器报告致命错误。 构成其余部分的令牌 #error 之后的行用作 错误信息。

    有关这些指令的可移植性,另请参阅 this question

    【讨论】:

    • #error 指令是 C 和 C++ 语言标准的一部分,并且是完全可移植的。 #warning 是 gcc 特定的语言扩展。
    猜你喜欢
    • 2015-01-09
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    相关资源
    最近更新 更多