我正在尝试定义这样的宏:
R = 0
'Write to worksheet
RSNonResourceCosts.MoveFirst
Do Until RSNonResourceCosts.EOF
For C = 1 To NRCols - 1
FieldName = RSNonResourceCosts.Fields(C).Value
If RSNonResourceCosts.Fields(Header(C)).Value <> "" Then
CL(C) = CL(C) + 1
WKS.Cells(200 + R, C) = RSNonResourceCosts.Fields(Header(C)).Value
End If
Next C
RSNonResourceCosts.MoveNext
R = R + 1
Loop
然后执行以下操作:
#define SOME_DEF [[TTys getString] isEqualToString:ANOTHER_STRING]
#if SOME_DEF
...
#endif
返回NSString [TTys getString]
之前定义为ANOTHER_STRING
我在#define ANOTHER_STRING "hello"
行上收到以下错误:
预处理程序表达式开头的令牌无效
基于此SO question,这可能是由于在编译时无法解决的问题引起的,但我已经定义了所有内容。我怀疑是
#if SOME_DEF
方法,但我不知道另一种方法。
答案 0 :(得分:1)
当您编写#if SOME_DEF
时,预处理器会将其解析为:
#if [[TTys getString] isEqualToString:ANOTHER_STRING]
这不是#if
预处理程序指令的有效条件:
'#if'指令允许您测试算术的值 表达,而不仅仅是一个宏的存在。它的语法是
#if expression controlled text #endif /* expression */
表达式是整数类型的C表达式,受到严格的限制。它可能包含
- 整数常量。
- 字符常量,被解释为它们 将是正常的代码。
- 添加的算术运算符, 减法,乘法,除法,按位运算,移位, 比较和逻辑运算(&amp;&amp;和||)。后两者服从 标准C的通常短路规则。
- 宏。所有的宏 在实际计算之前扩展表达式 表达式的价值开始了。
使用定义的运算符,它允许 检查是否在'#if'中定义了宏。
不是宏的标识符,它们都被认为是 数字为零。这允许你编写#if MACRO而不是#ifdef MACRO,如果你知道定义的MACRO将永远有一个 非零值。函数式宏在没有函数调用的情况下使用 括号也被视为零。
您可以做的是使用运行时评估的常规if语句:
if(SOME_DEF) {
...
}