Objective-C中常量重复定义的解决方案

  今天在项目中用到一些常用的字符串,于是我直接创建了一个constant.h文件用#define来定义。

  后来在网上看各位大神都建议用字符串常量来定义,于是我把所有的宏定义都换成了NSString * const,比如NSString * const LTNNextStep = @"下一步";

  该.h文件主要在两个类中使用,但是#import该文件后发现了一个链接问题:

ld:11 duplicate symbols for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

  原来,书中说在标准C中const定义的变量是外连接的,即如果一个编译单元中定义了一个全局const常量,则其在其他编译单元中是可见的,如果其他编译单元也定义了同名const常量就会产生重复定义错误。这一点与C++不同,C++中const定义的变量是内连接的,即每个编译单元定义的全局const常量是自己独有的。

Objective-C是标准C的另一种扩展,那么我犯的错误也就很明显了——当多个编译单元都引用那个constant.h文件时出现了重复定义错。

  但是将

  NSString * const,比如NSString * const LTNNextStep = @"下一步";

  修改为

  static NSString * const,比如NSString * const LTNNextStep = @"下一步";

  就顺利编译通过了。这里的static是用来把定义的const常量标记为对外不可见的。

  目前我的基础知识还不扎实,因此也说不出个所以然。以后会再仔细研究研究。

  用通用的方法,直接创建一个.h和一个.m文件,在.h文件中:

@interface Constant : NSObject

extern NSString * const LJNextStep;

@end

  这里使用到extern c关键字,表示这个变量已经声明,只是引用。const关键字表示变量是常量,不可修改。

  在.m文件中:

@implementation Constant

NSString * const LJNextStep = @"下一步";

@end
时间: 2024-11-18 09:23:36

Objective-C中常量重复定义的解决方案的相关文章

转载:Windows下stdlib.h与glut.h中exit()函数重复定义的解决方案

最近用到 OpenGL的第三方库Glut,碰到了exit()这个函数在stdlib.h与glut.h两个头文件中重复定义的情况,解决方案如下: 打开glut.h,找到exit()函数定义的地方(144行左右),替换为以下内容: #if defined(_WIN32) # ifndef GLUT_BUILDING_LIB #if _MSC_VER >= 1200 _CRTIMP __declspec(noreturn) void __cdecl exit(int); #else _CRTIMP v

link script(链接器ld吃的文件)中使用宏定义的解决方案

问题:工作中遇到一个需求:需要在ld script中使用类似C语言的define等宏定义来做一些判断和替换 实验: 1:理论上*.c中都能用,是否gcc/ld也支持在ld script中直接用宏呢,结果: arm-linux-ld:xxx.lds:2: ignoring invalid character `#' in expression arm-linux-ld:xxx.lds:2: syntax error 人说水火无情,看来ld和gcc也不给面子啊.这里用的是交叉编译的ld,x86的也是

C++ 中常量的定义与使用

如果将所有的常量声明在一个头文件中 例如 global.h 那么在其他文件使用的时候 最好直接extern 声明一下就可以了  不要用include global.h 对于 char* 类型  const char* p  中的p 不是常量     char* const p  这样p才是常量

解决VS2010中winsock.h与winsock2.h冲突(重复定义)——转载

解决VS2010中winsock.h与winsock2.h冲突(重复定义)——转载 当这两个头文件顺序颠倒时,编译会出现许多莫名其妙的错误,错误如下: 1>…\include\ws2def.h(91) : warning C4005: 'AF_IPX' : macro redefinition 1>…\include\winsock.h(460) : see previous definition of 'AF_IPX' … 或者这个错误 #error "ws2tcpip.h is 

Xaml中string(字符串)常量的定义以及空格的处理

(1)基本用法 xaml中可以实例化各种对象,比如在ResourceDictionary中定义字符串常量: <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:system ="clr-namespace:Sy

C语言头文件中定义全局变量导致重复定义错误

合作方升级SDK后,程序编译出现变量重复定义的错误,通过错误提示无法找到什么位置重复定义了,但确定是引入新SDK后才出现的错误,从SDK的头文件中查找,最终发现在头文件中定义了全局变量 我们的项目在多个头文件中include了SDK的头文件,所以相当于这个全局变量在多个头文件中定义了,因此报错. 总结:头文件不要有任何全局变量的定义出现

开发技巧----------项目中常量类的定义方式

问题: 有开发经验的同学都知道,常量类是一个最常用的定义数据字典的方式.但是随着项目的开发时间和开发团队的变化经常会出现2中特别苦逼的情况.第一种情况是项目中到处都能看到各种各样的常量类:第二种情况是一个常量类里定义非常多的常量,甚至有的超过100了.这两种情况的缺点估计大家都非常的清楚,第一种代码离散.冗余.维护难:第二种也是维护难,更痛苦的时候用ide的时候很难找到自己需要的常量. 解决办法: 1.使用静态内部类对常量进行分组(可以多级分组,但是建议最多3级) 2.外部文件(这里不讨论) 3

iOS中UITableViewCell的重用问题解决方案

UITableViewCell重用 为了能够保证tableViewCell能够高效的执行,Objective-c中引进了重用队列的机制,重影现象也是在重用队列时经常遇到的问题,那么如何解决这个问题呢?下面给出了几种解决办法. 第一种解决方法 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { NSArray *subViews = cell

分布式事务中常见的三种解决方案

目录 一.分布式事务前奏 二.柔性事务解决方案架构 (一).基于可靠消息的最终一致性方案概述 (二).TCC事务补偿型方案 (三).最大努力通知型 三.基于可靠消息的最终一致性方案详解 (一).消息发送一致性 (二).保证消息一致的变通做法 (三).常规MQ消息处理流程和特点 (四).消息重复发送问题和业务接口幂等性设计 (五).本地消息服务方案 (六).独立消息服务方案 (七).消息服务子系统的设计实现 一.分布式事务前奏 事务:事务是由一组操作构成的可靠的独立的工作单元,事务具备ACID的特