【问题标题】:Preprocessor directives and #error预处理器指令和#error
【发布时间】:2013-03-04 22:28:41
【问题描述】:

当有人试图在 WIN32 和 LINUX 以外的其他系统下编译我的代码时,我想显示错误。但是这段代码:

#ifdef WIN32
    // Some code here for windows
#elif LINUX
    // Some code for linux
#else
#error OS unsupported!
#endif

但这给了我一个错误:

#error 操作系统不支持

并且编译器没有说别的,只是错误。 怎么了?

【问题讨论】:

  • 我会说WIN32 没有定义,LINUX 要么没有定义要么为零。
  • 你是在 iOS 上编译吗?
  • @JonathanWakely 没关系 LuchianGrigore 不,在 Debian 7 上
  • 什么意思没关系? LINUX 未在 Linux 上定义,因此对其进行测试毫无意义。 OTOH __linux 是自动定义的。
  • 您是否应该优先检查_WIN32 而不是WIN32?根据stackoverflow.com/q/662084/311966,只有_WIN32保证在没有系统包含的情况下被定义。

标签: c++ compiler-errors g++ c-preprocessor


【解决方案1】:

这里有两个问题:

  • 您的#elif 不仅仅测试符号的存在,而是测试它的真实性(即定义非零)。您应该在开头使用#elif defined(...)#if defined(...)

  • 您匹配的符号错误。您应该分别使用_WIN32__linux__。更多平台请见this reference

【讨论】:

    【解决方案2】:

    LINUX 不是标准的预定义宏。您可能想检查 __linux 而不是 LINUX

    我知道_WIN32 的一些代码检查,但我不知道在 Windows 上什么是正确的。

    【讨论】:

    • __linux 似乎已经过时(不符合 POSIX),即使它工作正常。显然应该改用__linux__
    • 我认为引用是错误的,linux 不在保留的命名空间中,但__linux 在,所以我不知道为什么它不符合 POSIX。 __linux__ 当然也可以,更多信息请参见gcc.gnu.org/onlinedocs/cpp/…
    • "除了以前缀_POSIX_ 开头的标识符外,所有以 和大写字母或另一个 开头的标识符始终保留供实现使用。” pubs.opengroup.org/onlinepubs/9699919799/functions/…
    • 啊,我也在找那个,除了居然找到了。 ;) 所以是的,__linux 在 POSIX 意义上似乎是完全可以接受的,确实。不知道为什么我的链接说它已经过时了。我很抱歉。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多