Mik*_*ynn 0 objective-c c-preprocessor
我的问题基于Objective-C指令,并减去它们.以下是我的指示.
#define IS_IPAD FALSE
#define RECT_WIDTH IS_IPAD ? 725 : 280
#define RECT_PADDING IS_IPAD ? 50 : 10
Run Code Online (Sandbox Code Playgroud)
如果我NSLog("@%d", RECT_WIDTH - RECT_PADDING),那么我得到50而不是230.为什么会发生这种情况?我可以让它工作的唯一方法是将每个分配给一个int,然后减去这两个.
这是因为操作的优先级.您的代码扩展为:
NSLog(@"%d", FALSE ? 725 : 280 - FALSE ? 50 : 10);
Run Code Online (Sandbox Code Playgroud)
对于C的运算符优先级规则,一旦"括号",就会得到:
NSLog(@"%d", FALSE ? 725 : ((280 - FALSE) ? 50 : 10));
Run Code Online (Sandbox Code Playgroud)
这是宏的常见问题.它们几乎作为复制粘贴操作扩展,所以如果你不小心,你最终可能会遇到操作员优先级问题(就像你现在拥有的那样).
你有两种可能性.要么为您的定义添加括号,这样就不会发生这种情况:
#define RECT_WIDTH (IS_IPAD ? 725 : 280)
#define RECT_PADDING (IS_IPAD ? 50 : 10)
Run Code Online (Sandbox Code Playgroud)
或者,由于这是在编译时确定的,因此您可以使用#if指令:
#if IS_IPAD == FALSE
#define RECT_WIDTH 280
#define RECT_PADDING 10
#else
#define RECT_WIDTH 725
#define RECT_WIDTH 50
#endif
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
223 次 |
| 最近记录: |