@# 在 C 预处理器中是什么意思?

What does @# mean in the C preprocessor?

在下面的上下文中,@#expression1, expression2, @#expression2 是什么意思?

代码是Objective-C,但是Objective-C仍然使用C预处理器。

#define XCTAssertEqualObjects(expression1, expression2, ...) \
    _XCTPrimitiveAssertEqualObjects(self, expression1, @#expression1, expression2, @#expression2, __VA_ARGS__)

#define _XCTPrimitiveAssertEqualObjects(test, expression1, expressionStr1, expression2, expressionStr2, ...) \
({ \
    @try { \
        id expressionValue1 = (expression1); \
        id expressionValue2 = (expression2); \
        if ((expressionValue1 != expressionValue2) && ![expressionValue1 isEqual:expressionValue2]) { \
            _XCTRegisterFailure(test, _XCTFailureDescription(_XCTAssertion_EqualObjects, 0, expressionStr1, expressionStr2, expressionValue1, expressionValue2), __VA_ARGS__); \
        } \
    } \
    @catch (_XCTestCaseInterruptionException *interruption) { [interruption raise]; } \
    @catch (NSException *exception) { \
        _XCTRegisterFailure(test, _XCTFailureDescription(_XCTAssertion_EqualObjects, 1, expressionStr1, expressionStr2, [exception reason]), __VA_ARGS__); \
    } \
    @catch (...) { \
        _XCTRegisterFailure(test, _XCTFailureDescription(_XCTAssertion_EqualObjects, 2, expressionStr1, expressionStr2), __VA_ARGS__); \
    } \
})

XCTAssertEqualObjects 正在将您正在验证的表达式转换为字符串,因此在失败的情况下,它可以打印失败的表达式(通过 _XCTPrimitiveAssertEqualObjects_XCTRegisterFailure ).

在 C 预处理器中,使用 #stringify 传入的任何内容,因此您可以将其用作常量。通过在字符串前加上 @ 前缀,它变成了一个 Objective-C 字符串常量。