首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Objective-C 中 9 种避免使用 Xcode 预处理器宏的方法

C++ 程序员们已经深有体会:" "。不幸的是,还有很多的 Objective-C 程序员尚未领悟到这一点。 本文是Objective-C 中的代码气味系列文章中的一篇。...因为每次使用预处理器时,你看到的并不是你编译的内容。对于作为常量使用的 #define 宏,我们需要避免一些陷阱——其实我们完全可以避免这些陷阱。...*const JMRResponseSuccess = @"Success"; 6、条件编译:注释代码 各种形式的条件编译(#if、#ifdef 等)是一种选择性启用或禁用代码块的方法。...有关 plist 的示例,请参阅《我如何在暂存和生产 URL 之间切换(How I Switch between Staging and Production URLs)》。...9、条件编译:支持多个项目或平台 Smell #if PROJECT_A … #else … #endif 在多个项目(或多个平台)中共享代码时,很容易在共享源文件中偷偷加入特定于项目的扩展。

14610
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Swift和Objective-C混编在有赞移动的实践

    这样做的主要意义是: 语义上完整描述了一个框架的作用 提高编译时的可扩展性,同一模块只需编译或导入一次,避免了头文件的多次引用、解析 减少碎片化,每个模块只处理一次,环境的变化不会导致不一致 3.2 modulemap...配置将三方库构建成动态库时,在编译产物中都会生成一个 modulemap 和 module umbrella.h 文件 ? 可以在 Swift 文件这样引用该模块 ?...5.3 C++ 混编 Objective-C 是 C++ 的超集,就如同 Objective-C 是 C 的超集,在OS X 上同时被 GCC 和 Clang 支持编译,.mm 是 Objective-C...在.mm 文件中,Objective-C 代码和 C++ 代码都可以正常编译运行。...构建 Swift 静态库,不影响启动速度 七、总结 目前微商城项目已经进行了混编项目开发,比如学习中心模块是一个纯 Swift 的二方库,而消息业务模块则是一个 Swift 和 Objective-C

    2.3K20

    qmake:变量手册

    如果编译器不支持 C++11 或无法选择 C++ 标准,则此选项无效。默认情况下,支持处于启用状态。 c++14:启用 C++14 支持。...如果编译器不支持 C++14 或无法选择 C++ 标准,则此选项无效。默认情况下,支持处于启用状态。 c++17:启用 C++17 支持。...如果编译器不支持 C++20 或无法选择 C++ 标准,则此选项无效。默认情况下,支持处于禁用状态。 c++latest:启用对编译器支持的最新 C++ 语言标准的支持。...64、QMAKE_CXX 指定在构建包含 C++ 源代码的项目时将使用的 C++ 编译器。...135、QMAKE_OBJECTIVE_CFLAGS 指定用于构建项目的目标 C/C++ 编译器标志。除了 QMAKE_CFLAGS 和 QMAKE_CXXFLAGS 之外,还使用这些标志。

    3.9K20

    成为Oceanbase贡献者(2):源码解读build.sh debug --make 的执行过程

    、手动控制场景大型项目、跨平台开发功能简单的编译规则管理高级抽象配置,支持模块化开发跨平台性较差,仅适用于特定平台跨平台,支持多种IDE和编译器灵活性高,可直接修改规则中等,通过配置文件间接修改构建流程维护性差...+ 编译器(如 GCC 和 Clang)时,-std=gnu++11 和 -std=c++11 是两个不同的标准选项,它们有一些关键的区别。...以下是这两个选项的详细解释:-std=c++11纯 C++ 标准:这个选项严格遵循 C++11 标准。不包含 GNU 扩展:编译器不会启用任何 GNU 特定的扩展。...包含 GNU 扩展:编译器会启用一些非标准的功能和特性,这些功能可能在其他编译器上不可用。...GNU project C and C++ compilerclang:clang - the Clang C, C++, and Objective-C compiler/usr/local/opt/

    4700

    编写你的专属 MSBuild C# 代码生成器:在保存文件时自动实时生成你的代码

    我之前的博客中有介绍如何在项目中生成额外的代码,也有介绍制作一个生成代码的 NuGet 包。...而本文是在此基础上更进一步,可以让生成代码变成实时的;更准确的说,是在保存文件时即生成代码,而无需完整编译一次项目。...我们即将实现的是:在保存 Test.txt 文件时,会立即执行我们的编译流程,这样,我们便能基于 Test.txt 来实时生成一些代码。...关于时机,可以阅读: 通过重写预定义的 Target 来扩展 MSBuild / Visual Studio 的编译过程 在制作多框架项目的 NuGet 包时应该注意的问题(buildMultiTargeting...对于已知的项(Item)来说,Generator 属性是 MSBuild 编译时的一个已知元数据(Metadata),其作用为当此文件改变时,会执行一个指定的 Target 我们将其指定为 MSBuild

    41610

    【AI系统】LLVM 架构设计和原理

    面对这一系列问题,苹果一直寻找高效、模块化和更自由的开源替代方案。最终,苹果聘请了编译器领域的专家克里斯·拉特纳来领导 LLVM 项目的实现,标志着 LLVM 编译器的诞生。...于是开发者决定摒弃缩写的含义,现在 LLVM 已经成为一个品牌,用于指代 LLVM 项目下的所有子课程,包括 LLVM 中介码(LLVM IR)、LLVM 调试工具、LLVM C++标准库等。...作为一个新的编译器,Clang 提供对 C、Objective-C 和 C++ 的支持,并且得到了苹果公司的大力支持。...对于用户而言,通常会使用 Clang 作为前端,而 LLVM 的优化器和后端处理则是透明的。前端(Front-End):负责处理高级语言(如 C/C++/Obj-C)的编译,生成中间表示(IR)。...当用户编写的 C/C++/Obj-C 代码输入到 Clang 前端时,Clang 会执行以下步骤:词法分析(Lexical Analysis):将源代码转换为标记(tokens)。

    21210

    GUN 意思

    Bash Shell GCC与G++ 首先GCC是the GNU Compiler Collection的意思,是GNU的一个编译器集合,里面包含了多种编译器及相关工具,如gcc、g++。...GCC是多种主要编程语言编译器的整合(或叫集成)发布。这些编程语言目前包含C, C++, Objective-C, Objective-C++, Java, Fortran和Ada。...GNU的C++编译器(GNU C++ Compiler),也是GNU Compiler Collection的一部分; GDB GDB是GNU Project的一个调试程序(GNU Debugger...GDB可以调试以下编程语言编写的程序:Ada、C、C++、Objective-C、Pascal等,这些程序可能执行在相同的机器上(本地调试),也可能执行在不同的机器中(远程调试),GDB可以运行在最爱欢迎的...参考阅读:The GNU Project Debugger Makefile Makefile是程序编译的规则,makefile记录着整个工程的编译规则(如源文件的编译顺序、依赖关系等),通过make

    3.2K20

    编程能力七段论

    这样做的好处是:   1,编译器可以在编译时就能找出类型错误。   2,编译器编译时知道类型信息,就可以提高性能。...其中的代表是C++和Objective-C。   C++是一种新的语言,但大部分语言元素是和C兼容的。   Objective-C是完全兼容的C的。...C++的模板编程,是在编译时,根据源码中的使用情况,创建对应类型的代码。除了C++这种方式,Java,C#也有类似的机制,叫做“泛型”,但它们的实现方式和C++的模板很不同。...一些C++高手又在模板的基础上搞出了“模板元编程”。因为模板编程,就是C++的编译器搞定的嘛,模板元编程就是让编译器运算,编译完结果也就算出来了。我不知道除了研究和炫技,这玩意有啥用?   ...C++过分复杂,太多的坑消耗了大量程序员的大量精力。我使用C++时,只使用面向对象部分和模板部分,其他过于精深的特性都不使用。

    1.2K50

    Swift 2023:所有权、宏和 C++ 互操作

    它是 Rust 最具有决定性的语言特征之一,是其提供内存安全保证的基础。 Rust 使用了第三种方法:内存是通过一个所有权系统来管理的,该系统有一套编译器检查规则。如果违反了任何规则,程序就不会编译。...新的实现完全采用 Swift 编写,旨在通过消除 Objective-C 和 Swift 之间的转换成本来提升性能,并对其进行模块化和清理。...不过,对于其他支持 Swift 但只有原始 GNUstep Objective-C 运行时的平台(如 Linux)来说就不是这样了。...(https://xie.infoq.cn/article/a90dfad02a8148e0f2c1c8cb4) 现代化工具链在大规模 C++ 项目中的技术实践 (https://www.infoq.cn...争相上市、抢夺本土市场,未来三五年数据库将迎来大洗牌 | 解读数据库的2022 颠覆开发模式的创新发布背后,我看见了云计算的下一个十年

    1.4K10

    iOS 代码使用 C++ 的 zero-cost abstraction 特性

    不少 iOS 项目里都有 C++ 代码的痕迹,Objective-C 和 C++ 虽然都是 C 的 superset,但二者在语言特性上存在很大差异,Objective-C 的 runtime 使其语言的特性更丰富更易使用...zero-cost abstraction Objective-C 和 C++ 同为面向对象语言,我们通过对象来抽象世界中的概念,但 Objective-C 的抽象伴随着代价,抽象越多,定义的类越多,最后编译出的...即使我们加入更多的抽象,比如把 User 类放进 Car 类里面,再把 Car 放进 City 类里,当我们使用 city->car->user->age 时,编译器依旧会将代码翻译成直白的 memory...我只列出了关键的几步,中间其实省略了 n 个流程,类越多,抽象的层次越多,步骤也就越多,这是由于 Objective-C 需要将 class 的定义编译进最后的 binary 里,需要依赖 class...C++ 的 zero-cost 特性得益于编译器的高效实现,我们在代码里定义的所有类,最后都会被编译器降维,高楼被夷为平地,信息却不会丢失,编译器用一片二向箔将面向对象的世界压扁成一幅画,画里的机器码仍然能严格准确的表达我们的意图

    88130

    Mac OS X 背后的故事(上)

    原因很简单,使用这个特性,会有很大的性能损失,使 Objective-C 的内存管理效率低得和 Java 一样,而且一旦有一个模块启用了这个特性,这个进程中所有的地方都要启用这个特性——因此如果你写了一个使用垃圾回收的库...这项研究让他在 2005 年毕业时,成为小有名气的编译器专家,他也因此早早地被 Apple 相中,成为其编译器项目的骨干。   ...C++ 是一门非常复杂的语言,大多编译器(如 GCC、MSVC)用了十多年甚至二十多年来完善对 C++ 的支持,但效果依然不很理想。Clang 的 C++ 支持却一直如火如荼地展开着。...2010 年 2 月 4 日,Clang 已经成熟到能自举(即使用 Clang 编译 Clang,到我发稿时,LLVM 3.0 发布已完整支持所有 ISO C++ 标准,以及大部分C++ 0x 的新特性...LLVM 周边工具   由于受到 Clang 项目的威胁,GCC 也不得不软下来,让自己变得稍微模块化一些,推出插件的支持,而 LLVM 项目则顺水推舟,索性废掉了出道时就一直作为看家本领的 LLVM-GCC

    3.1K40

    CC++在Java、Android和Objective-C三大平台下实现混合编程

    Android和iOS开发都支持C++开发,可以一套代码多平台使用。同时C++难以反编译的特性也可以为Android开发带来代码的保密,另一native特性也可以提高代码的运行效率。...一、为什么使用C/C++ 便于移植,用C/C++写得库可以方便在其他的平台上再次使用。 代码的保护,由于java层代码很容易被反编译,而C/C++库反汇难度较大。...如何在Objective-C项目中使用C++; 在Objective-C使用C/C++非常简单,仅仅需要把.m后缀的文件改成.mm即可使用C++,我们通常不会把.mm的文件写到整个项目都有,而是设计一个接口...#include #include 2.在普通的JAVA项目中使用JNI编程 由于我是在MAC下办公,所以这里就介绍如何在MAC下进行JNI开发,在Windows...编译后文件 根据自己的电脑环境,查找编译后的文件,我的路径是 /Users/Wiki/Library/Developer/Xcode/DerivedData/DEMO_MAC_JNI-clxymnzifegyfaajsaattzgxqfbr

    1.2K20

    【一通百通】CC++的std标准总结

    适用C(或C源代码,如C ++,Objective-C和Objective-C ++)的标准: -ansi 在C模式下,这相当于 -std = c90的。...这将关闭不兼容的与ISO C90(编译时C代码),或标准的C ++(编译C ++时代码)GCC的某些特征,如asm与typeof关键字,以及预定义的宏如unix和vax标识系统的类型你正在使用。...有关这些标准版本的详细信息,请参阅GCC支持的语言标准。当选择编译C或C ++时,此选项目前才被支持。...编译器可以接受几个基本标准,如“c90' 要么 'c ++ 98'和这些标准的GNU标准,如“gnu90' 要么 'gnu ++ 98'。...另一方面,当指定了标准的GNU标准时,编译器支持的所有功能都被启用,即使这些功能改变了基本标准的含义。因此,一些严格的程序可能会被拒绝。

    1.1K30

    基于 React 的 Material UI 组件库:永久免费使用 | 开源日报 No.266

    material-uihttps://github.com/mui/material-ui Stars: 91.8k License: MIT picture material-ui 是一个包含基础 React UI 组件库的项目...llvm-projecthttps://github.com/llvm/llvm-project Stars: 25.9k License: NOASSERTION llvm-project 是一个模块化和可重用的编译器和工具链技术集合...该项目的主要功能、关键特性、核心优势包括: 包含 LLVM 工具箱,用于构建高度优化的编译器、优化器和运行时环境 包含多个组件,其中核心部分称为 “LLVM”,包括处理中间表示并将其转换为目标文件所需的所有工具...、库和头文件 Clang 前端用于编译 C、C++、Objective-C 和 Objective-C++ 代码到 LLVM 位码,并从那里转换成目标文件 其他组件包括 libc++ C++ 标准库,LLD...完整的 SQL 支持:与 BI 工具如 Metabase 和无代码工具如 Appsmith 等软件无缝集成,并可直接使用原生 SQL 检索数据。

    19110

    iOS学习——iOS 整体框架及类继承框架图

    Objective-C和Java C++一样,有封装,继承,多态,重用。...3.2 Objective-C的优点   Objective-C语言有C++ Java等面向对象的特点,那是远远不能体现它的优点的。Objective-C的优点是它是动态的。...它指向一个类对象(class object  记住它是个对象,是占用内存空间的一个变量,这个对象在编译的时候编译器就生成了,专门来描述某个类的定义),这个类对象包含了Objective-C 对象的一些信息...(为了区分两个对象,我把前面提到的对象叫Objective-C对象),包括Objective-C对象的方法调度表,实现了什么协议等 等。...不考虑@interface关键字在编译时的作用,可以把NSObject更接近C语言结构表示为: struct NSObject{   Class isa; } Class是用typedef

    3.6K70

    认识 LLVM

    简介 LLVM是一套提供编译器基础设施的开源项目,是用 C++ 编写,包含一系列模块化的编译器组件和工具链,用来开发编译器前端和后端。...,而是包括 LLVM 中介码(LLVM IR)、LLVM调试工具、LLVM C++ 标准库等一系列编译工具及低端工具技术的集合。...像真正的 RISC 指令集一样,它支持简单指令的线性序列,如加法、减法、比较和分支。这些指令采用三地址形式,这意味着它们接受一定数量的输入并在不同的寄存器中产生结果。...LLVM 提供了 Clang 作为官方的编译器前端,同时支持 C、C++、Objective-C 和 Objective-C++ 语言。...许多 GCC 的前端也已经可以与其运行,LLVM目前支持 Ada、C语言、C++、D语言、Fortran、Haskell、Julia、Objective-C、Rust 及 Swift 等语言的编译。

    1.3K20

    编程语言70年:谁是世界上最好的编程语言?

    在补充了一些关键性的特征和评价之后,我整理出下图: 整理图的过程中,我发现很多有趣的点。让我们按时间顺序从上往下讲这张图。...这时出现了很多新的语言蠢蠢欲试,其中包括 D 语言和 Rust:D 语言是 C++编译器作者设计实践的一门新语言,它吸收了很实际项目的 C++经验教训。...但是仔细了解 D 语言你会发现,这就是拿 C++编译器魔改的一个「私有 C++语言」编译器。这也导致很多 C++的弊病不能彻底废除,属于改良派。 过了 3 年,Rust 横空出世。...对于现有的大型项目的开发人员来说,从 Java 到 Kotlin ,或者从 Objective-C 到 Swift 有点难以适应。...编程语言发展至今,特性的互相借鉴的情况越来越普遍,语言生态互通也更常见(如直接兼容,或者 Bridging 技术),编译型和解释型界限也越来越模糊(比如 Dart 既能编译运行也能解释运行,还能边解释运行边编译

    3K100
    领券