解释 C 预处理器代码

2023-12-12

Given #define LOG_OBJECT(object) (NSLog(@"" #object @" %@ %@:%d”, [object description], [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__));该声明LOG_OBJECT(self);将产生:

2014-07-18 17:43:30.041 FrogCamera[12484:2144843]自我 ViewController.m:20

我希望了解预处理器代码是如何工作的。如何查看预处理器生成的语句?

具体来说:

  1. 为什么整个 #define 语句都包含在( ) ?
  2. Is #object提供什么值的文本替换?
  3. 为什么要求@""之前#object ?
  4. 即如何@“” #object @“ %@ %@:%d”变换为@"self %@ %@:%d" ?

这是一个使用示例:

@interface ViewController ()
#define LOG_OBJECT(object)  (NSLog(@"" #object @" %@ %@:%d", [object description], [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__));
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    LOG_OBJECT(self);
    // = 2014-07-18 17:48:19.439 FrogCamera[12597:2151087] self <ViewController: 0x79755000> ViewController.m:20
    (NSLog(@"self %@ %@:%d", [self description], [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__));
    // = 2014-07-18 17:48:19.440 FrogCamera[12597:2151087] self <ViewController: 0x79755000> ViewController.m:21
}
@end

See GlobalUtilities.hLOG_OBJECT 语句的起源。


这相当简单:

  1. 每当扩展宏可能执行意外操作时,都会使用宏中的括号。一个典型的例子是:
    #define SUM(A, B) A + B
    SUM(1, 1) * 3 //the expected result is 6, the real result is 1 + 1 * 3 = 4 
    在每个宏周围添加括号是防止此类错误的良好编程约定。
  2. #param是一个字符串化运算符。它将参数括在引号中 - 例如,参数value被转换为"value".
  3. 字符串化运算符创建一个 C 字符串,它是一个字符数组 (char *)。作者想要一个NSString *,这就是为什么他要添加一个@在一开始的时候。注意@"aaa" "bbb"相当于@"aaabbb"(此功能使我们能够将字符串拆分为多行)。然而,这并不是很优雅。用一个%s会让事情变得简单一点。
  4. 它仅转换为@"" "self" @" %@ %@:%d"。编译器将连续的字符串视为一个字符串。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解释 C 预处理器代码 的相关文章

  • 更改导航项(栏)的背景颜色

    有没有一种简单的方法可以更改视图顶部导航项的背景颜色 我有一个基于导航的应用程序 我只希望一个视图获得另一种背景颜色 我主要使用 IB 创建视图 我找到了以下解决方案 未测试 float r 10 float g 55 float b 13
  • 重叠的装载机圆

    我试图重现苹果为应用程序 活动 制作的重叠圆圈 见下图 如果您使用标准贝塞尔路径 起始 结束位置将仅在 0 到 2PI 之间产生影响 例如 如果您尝试填充 4PI 即使使用一些阴影 则无法模拟重叠加载 如何制作类似于苹果解决方案的东西来创建
  • AVCaptureDevice 找不到任何设备

    这行代码是我今天遇到的问题 macOS 应用程序 NSArray devices AVCaptureDevice devicesWithMediaType AVMediaTypeVideo 我更新Xcode后 系统总是让我空着devices
  • 如何为 NSAttributedString 内的文本设置“隐藏”属性?

    我有一个 Cocoa 应用程序NSTextView控件将其文本保存在NSAttributedString 实际上我相信这是一个NSMutableAttributedString 我可以轻松地在该字符串内的不同字符范围上设置和修改不同的文本属
  • iPhone/Objective-C - 呈现视图和委托时的 UIDocumentInteractionController 类参考

    我在用UIDocumentInteractionController在我的应用程序中 以便在我的应用程序中呈现 Instagram 过滤器屏幕 如下所述 http instagram com developer iphone hooks h
  • 如何用图片替换UITableView?

    我有一个 UITableView 默认为空白 直到用户编辑并向其添加数据 我想显示一张带有说明的图像 直到用户编辑它为止 图片的大小非常适合导航栏和标签栏之间 有没有办法以编程方式执行此操作 您可以使用removeFromSuperview
  • 将 UIButton 中的图像缩放到 AspectFit?

    我想将图像添加到 UIButton 并且还想缩放图像以适合 UIButton 使图像变小 请告诉我该怎么做 这是我尝试过的 但它不起作用 将图像添加到按钮并使用setContentMode self itemImageButton setI
  • 错误域=AVFoundationErrorDomain代码=-11814“无法记录”

    它不断给我错误 错误域 AVFoundationErrorDomain代码 11814 无法记录 我不确定问题是什么 我试图在拍照后计数器达到 1 时录制声音 static int counter counter will always b
  • 关于窗口层次结构的警告

    我的调试器中出现这样的警告 这是什么意思 Warning Attempt to present
  • 拖动时获取MKAnnotation的坐标

    我正在根据用户添加的注释的位置创建一条路径 MKPolyline 我想允许用户通过拖动引脚来更改路径 我目前可以做到这一点 但 MKPolyline 不会更新 直到引脚被放下 我实施了 void mapView MKMapView mapV
  • iPhone 和加密库

    我想我必须在我的 iPhone 应用程序中使用加密库 我想问你有关苹果公司实施的加密货币出口政策的影响 我需要做一些额外的事情吗 例如填写表格等 1 如果我使用 MD5 进行哈希处理 2 如果我使用对称加密 Thanks EDIT 2009
  • 使用基于约束的布局自动调整 NSTokenField 的大小

    有没有办法自动调整大小height使用约束的 NSTokenField 保持宽度恒定 sizeToFit应该有效 但事实并非如此 如果我设置一个约束来保持宽度不变并调用此方法 它将忽略约束并仅调整宽度大小 当我想要的是仅调整高度大小时 基于
  • 无法在 Windows 上使用 Gnustep 编译 Objective C

    嗨 我是初学者 学习目标c 我发现错误 hello m 1 34 Foundation Foundation h 没有这样的文件或目录 我开始知道我需要制作一个 make 文件 我可以知道如何制作 make 文件吗 无需创建 makefil
  • 如何在iOS应用程序中捕获用户的手写签名[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 在我的应用程序中 用户将请求客户提供数字化的手写签名 我需要能够在用户在触摸屏上 书写 签名时捕获签名
  • 如何检查 BOOL 是否为空?

    有没有办法在将值分配给 BOOL 之前检查该值是否为 NULL Nil 例如 我在 NSDictionary 中有一个值可以是 TRUE FALSE NULL mySTUser current user following results
  • Objective-C中如何使继承的类能够看到父类的隐藏方法[重复]

    这个问题在这里已经有答案了 我有两个类 Class1 和 Class2 第二个类继承自第一个类 我需要重写 Class1 的 update 方法来实现我的目标 继承方法中 update方法的改变是在代码中间进行的 所以我不能使用 超级更新
  • Swift 闭包作为 AnyObject

    我尝试使用这个方法 class addMethod 在 Obj c 中使用如下 class addMethod self class selector eventHandler imp implementationWithBlock han
  • 玻璃效果 UIView

    我想知道如何在 UIView 上添加玻璃效果 我想像这样的效果 http pttrns com pickers detail 0dc9d9f6c6a7577613b3453768eee3b3在灰色半透明视图上 您 可以在这里看到 Thank
  • 如何更改已上传的 Firebase 存储图像文件名?

    我需要更改已上传到 firebase 存储中的文件名 因为 在 firebase 存储中上传图像后 我将 url 保存在 firebase 数据库中的特定子 文件夹 下 但是 当我将图像移动到另一个子 文件夹 时 我需要根据新名称更改存储中
  • 将 CALayer 旋转 90 度?

    如何旋转CALayer90度 我需要旋转所有内容 包括子图层和坐标系 Obj C theLayer transform CATransform3DMakeRotation 90 0 180 0 M PI 0 0 0 0 1 0 Swift

随机推荐

  • ddply+summary函数列名输入

    我正在尝试使用ddply and summarise一起从plyr包 但在解析不断变化的列名时遇到困难 在我的示例中 我想要一些能够以编程方式在 X1 中解析的东西 而不是在 X1 中硬编码到 ddply 函数中 举例说明 require
  • Android - 无法隐藏进度条

    因此 我检查了其他问题以隐藏进度条 但所有问题似乎都建议做我已经在做的事情 我正在尝试使用 mProductListProgressBar setVisibility View GONE 我找到它 mProductListProgressB
  • Makefile 更新了库依赖项

    我有一个很大的 makefile 它构建几个库 安装它们 然后继续构建链接到这些已安装库的对象 我的麻烦是我想使用 lfoo lbar 作为 g 标志来链接两个已安装的库 但依赖关系变得混乱 如果我更改库 foo 所依赖的标头 42 h 那
  • 查找 python 的安装位置(如果不是默认目录)

    Python 在我的机器上 我只是不知道在哪里 如果我在终端中输入 python 它将打开 Python 2 6 4 这不在它的默认目录中 肯定有一种方法可以从这里找到它的安装位置 sys有一些有用的东西 python Python 2 6
  • 如何在 3D 空间中围绕 x 轴旋转正方形

    所以我一直在尝试学习 3D 渲染是如何工作的 我尝试编写一个脚本 目标是在 3D 空间中旋转平面 2D 正方形 我首先在标准化空间 1 1 中定义一个正方形 请注意 只有 x 和 y 被标准化 class Vec3 3D VECTOR de
  • 为什么在尝试从列表中删除元素时会收到 UnsupportedOperationException?

    我有这个代码 public static String SelectRandomFromTemplate String template int count String split template split List
  • Python Selenium onclick 抛出 ElementNotInteractableException

    在我想使用 Selenium 进行交互的网站上 有以下 html 代码部分 a href img src img rename png 1 alt change name title change name a 这显示了一个小图像 单击该图
  • 根据单元格值更改 Excel 中的弧长

    我想根据单元格值动态更改 Excel 中的弧长 例如 如果单元格值 100 则拱形应成为完整的圆形 如果该值 0 它应该消失 我发现下面的代码可以更改形状的大小 但我不知道如何修改它来更改长度 Example 非常感谢您的帮助 Privat
  • 通过变量之一的值设置堆积条形图的顺序

    我被要求制作一个堆叠条形图 其中的条形和值以精确的方式堆叠和排序 在本例中 A3 在左侧 A2 在中间 A1 在右侧 我已经解决了 我没有注意到的是 我还被要求按 A1 的值降序排列条形 在这种情况下 这意味着 值 11 出现在顶部 按降序
  • Runtime.exec() 的安全问题

    我正在使用 Runtime exec 来运行可执行文件 我一直在研究并发现在应用程序中使用它时可能存在安全问题 使用 Runtime exec 运行可执行文件时是否存在安全问题 Jeanne Boyarsky 显然你不能按照你提到的方式注入
  • 本地主机上的目录名(__FILE__)

    我正在使用 WAMP 并且在 www 目录中有一个开发站点 我想用dirname FILE 定义服务器根目录的路径 目前我正在使用一个配置文件 其中包含 define PATH dirname FILE 我将配置文件包含在我的header
  • Android Studio:错误文件名、目录名或卷标语法不正确

    我使用的是 Windows 7 64 位并切换到最新的 Android Studio 但收到此错误 错误 配置项目 myproject 时出现问题 无法标准化文件 C Users me Apps Android android myproj
  • 将 8 个布尔值转换为 1 个字节的最佳方法?

    我想将 8 个布尔值保存到一个字节 然后将其保存到一个文件中 这项工作必须针对非常大的数据完成 我使用了以下代码 但我不确定它是最好的代码 就术语而言 速度和空间 int bits 1 0 0 0 0 1 1 1 char a 0 for
  • UnicodeDecodeError:“ascii”编解码器无法解码位置 47 中的字节 0x92:序号不在范围内(128)

    我正在尝试使用 Python 在 StringIO 对象中写入数据 然后最终使用 psycopg2 的 copy from 函数将此数据加载到 postgres 数据库中 首先 当我这样做时 copy from 抛出错误 错误 编码 UTF
  • d3.js 中的转义字符

    我需要在图表的刻度格式中显示微摩尔每升 mol L 但是当我传入 mol L 时 它会显示字符 而不是 mu 的符号 我如何让它渲染符号 在这种情况下 您不应使用 HTML 实体 一旦你处理 SVG 请使用 u00B5 检查这个片段 var
  • 计算混淆矩阵的更快方法?

    我正在计算图像语义分割的混淆矩阵 如下所示 这是一种非常冗长的方法 def confusion matrix preds labels conf m sample size preds normalize preds 0 9 returns
  • 如何动态更改 UIStoryboard 中使用的颜色

    我想知道是否可以在故 事板中分配 动态 颜色 从iOS7开始 您可以使用tintColor并通过keyWindow的tintColor以编程方式更改它 但我找不到一种方法来影响按钮背景的色调颜色 这可以让我轻松地找到一种方法来主题我的应用程
  • 处理多种类型的 Cosmos DB 容器的读取?

    我想在单个 Cosmos DB 容器中存储几种不同的对象类型 因为它们都按逻辑分组 并且可以按时间戳一起读取 以避免额外的 HTTP 调用 但是 Cosmos DB 客户端 API 似乎没有提供一种简单的方法来执行多种类型的读取 到目前为止
  • tsql 字符串与 select 和 order by 的连接不能与 order by 子句中的函数一起使用?

    考虑下面的sql create function dbo wtfunc s varchar 50 returns varchar 10 begin return left s 2 end GO select t into test from
  • 解释 C 预处理器代码

    Given define LOG OBJECT object NSLog object d object description NSString stringWithUTF8String FILE lastPathComponent LI