11

什么是传统 c 风格#error关键字的快速替换?

当预定义失败时,我需要它来引发编译时错误:

#if CONFIG1
    ...
#elseif CONFIG2
    ...
#else
    #error "CONFIG not defined"
#endif
4

3 回答 3

9

好消息 - 如果您使用的是 Swift 4.2 或更新版本,您现在可以使用#error()#warning()

例如:

let someBoolean = true

#warning("implement real logic in the variable above") // this creates a yellow compiler warning

#error("do not pass go, do not collect $200") // this creates a red compiler error & prevents code from compiling

在此处查看已实施的提案https://github.com/apple/swift-evolution/blob/master/proposals/0196-diagnostic-directives.md

于 2018-08-05T22:38:12.057 回答
4

#error 的主要思想是在缺少某些内容时导致编译错误,因为 swift 还没有类似的预处理器语句,只需强制编译错误,就像这段代码一样。

#if CONFIG1
...
#elseif CONFIG2
...
#else
    fatalError("CONFIG not defined")
    callingANonExistingFunctionForBreakingTheCompilation()
#endif

请记住,C/C++ 不会验证不匹配块的语法,但 Swift 会,所以这就是我调用函数而不只是编写消息的原因。

另一种选择是使用您自己的标签来生成错误并在编译之前对其进行检查,就像这个人在这里所做的那样

于 2017-10-23T16:00:29.330 回答
3

根据文档,没有特定的#error 宏。但是,程序可以通过编译。

这样做的方法是在#if/#endif 子句中定义您将使用的变量。如果没有子句匹配,则变量将未定义并且程序将无法编译。

通过变通方法可以在故障站点引发错误。在#else 子句中输入纯字符串,会产生语法错误。使用@available将生成编译器警告。

#if CONFIG1
    let config = // Create config 1
#elseif CONFIG2
    let config = // Create config 2
#else
    // Compilation fails due to config variable undefined errors elsewhere in the program.

    // Explicit syntax error to describe the scenario.
    Config not specified.

    // This generates a compiler warning.
    @available(iOS, deprecated=1.0, message="Config not defined")
#endif

// Use config here, e.g.
let foo = config["fooSize"]
于 2016-07-13T10:54:17.060 回答