Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何防止Cocoa框架中的C++名称损坏

如何防止Cocoa框架中的C++名称损坏
EN

Stack Overflow用户
提问于 2013-08-26 06:11:43
回答 1查看 1.4K关注 0票数 4

我在中创建了一个函数,我想导出它。这个函数是在ObjectiveC++中实现的,C++的名字使我抓狂。

我已经在一个外部"C“块中声明了该函数,但没有结果。

这是框架中的头文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#import <Cocoa/Cocoa.h>

extern "C"{
    void display(NSString *text);
}

@interface Display : NSObject

@end

这是.mm文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#import "Display.h"

#include <string>
#include <iostream>

using namespace std;

void display(NSString *text){
    cout << [text cStringUsingEncoding:NSUTF8StringEncoding] << endl;
}

@implementation Display


@end

它编译得很好,没有任何错误。

在客户端,我添加了框架,导入了公开的标头,并试图调用函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
display(@"Hola");

这里我收到一个警告,抱怨“函数显示的隐式声明在C99中无效”

为了使伤害雪上加霜,在公开的头文件中,我在extern "C“行中得到一个错误(框架项目中没有显示):

“预期标识符或("”)

还需要什么才能让这一切顺利进行呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-26 06:52:39

您需要将extern "C"添加到函数实现和声明中。如果函数的实现在一个.mm (Objective++)文件中,它将被编译为Objective++,并带有名称mangling。对于同名的函数,您有一个extern "C"声明并不重要。他们仍然被看作是两件不同的事情。

因此,还可以在extern "C"中包装您的实现,以删除函数实现的名称损坏:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
extern "C" void display(NSString *text) {

}

或者:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
extern "C" {
    void display(NSString *text) {

    }
}

此外,如果您希望您的头可以被C代码使用,那么您需要添加一个#ifdef,以便在编译为C++时只使用extern。在C中,extern不是有效的关键字:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#ifdef __cplusplus
    extern "C" {
#endif
void display(NSString *text);
#ifdef __cplusplus
    }
#endif

有关详细信息,请参阅cplusplus work?

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18446218

复制
相关文章
Cocoa框架梳理笔记
想要做好iOS的应用开发,深入的理解Cocoa框架是十分重要的。 今天做一下自上而下梳理,这样在开发的时候会更清晰,遇到问题也可以更容易的找到方向。
雪碧君
2023/02/15
9830
iOS中Cocoa框架·Runtime及isa指针知识·填坑
是什么因素使一个程序成为Cocoa程序呢?不是编程语言,因为在Cocoa开发中你可以使用各种语言;也不是开发工具,你可以在命令行上就可以创建Cocoa程序。Cocoa程序可以这么说,它是由一些对象组成,而这些对象的类最后都是继承于它们的根类 :NSObject。而且它们都是基于Objective-C运行环境的。
陈满iOS
2018/09/10
1K0
iOS中Cocoa框架·Runtime及isa指针知识·填坑
如何修复Windows 10中损坏的系统文件!
相信大家用电脑的都遇到过这样的情况:电脑在启动过程中感觉有问题或遇到问题,这时候则Windows系统文件可能已损坏,丢失,甚至已被某个软件安装更改。与之前的大多数Windows版本一样,Windows 10包含一个名为「SFC」的命令提示实用程序,它将扫描,验证和修复系统文件。
FreeRonin
2019/08/22
9.6K0
C++栈展开如何防止内存泄露
在栈展开(stack unwinding)是指,如果在一个函数内部抛出异常,而此异常并未在该函数内部被捕捉,就将导致该函数的运行在抛出异常处结束,所有已经分配在栈上的局部变量都要被释放。如果被释放的变量中有指针,而该指针在此前已经用new运算申请了空间,就有可能导致内存泄露。因为栈展开的时候并不会自动对指针变量执行delete(或delete[])操作。
恋喵大鲤鱼
2019/02/22
1.1K0
C++栈展开如何防止内存泄露
在栈展开(stack unwinding)是指,如果在一个函数内部抛出异常,而此异常并未在该函数内部被捕捉,就将导致该函数的运行在抛出异常处结束,所有已经分配在栈上的局部变量都要被释放。如果被释放的变量中有指针,而该指针在此前已经用new运算申请了空间,就有可能导致内存泄露。因为栈展开的时候并不会自动对指针变量执行delete(或delete[])操作。
恋喵大鲤鱼
2018/08/03
6770
zk中如何防止羊群效应
那么问题来了?如果同时有1000个客户端发起请求并创建临时节点,都会去监听A结点的变化,然后A删除节点的时候会通知其他节点,这样是否会太影响并耗费资源了?那么怎么有效避免羊群效应呢?
简单的程序员
2020/08/12
3K1
zk中如何防止羊群效应
使用Elastic Job的namespace配置,防止任务名称的冲突
昨天,有群友反应根据之前这篇《使用Elastic Job实现定时任务》(https://blog.didispace.com/spring-boot-learning-2-7-2/)文章编写测试定时任务的时候,报了类似下面的这个错误: Caused by: org.apache.shardingsphere.elasticjob.infra.exception.JobConfigurationException: Job conflict with register center. The job 'my-
程序猿DD
2023/04/04
6260
使用Elastic Job的namespace配置,防止任务名称的冲突
从损坏的手机中获取数据
有时候,犯罪分子会故意损坏手机来破坏数据。比如粉碎、射击手机或是直接扔进水里,但取证专家仍然可以找到手机里的证据。
FB客服
2020/02/23
10.2K0
Netty中的线程名称
创建的第一个步骤就是创建线程执行器ThreadPerTaskExecutor, 这个线程执行器就是用来创建Netty底层的线程的. 在学习Java的Thread时候,线程默认名称类似thread-0,thread-1,thread-2...以此类推. 而线程的名称对于我们排查问题的时候也是起到很大作用的, 因此我们在设计线程池, 也会根据一定的规则给线程池中的线程命名, 这也是一个好的习惯.
书唐瑞
2022/06/02
1.1K0
Netty中的线程名称
C++随记(九)---名称空间
本文介绍了C++中的名称空间,包括声明区域和潜在作用域,以及如何使用名称空间来避免名称冲突。同时,还介绍了使用using声明和using编译指令来导入名称空间,以及如何使用命名空间来管理名称的作用域。
TeeyoHuang
2017/12/28
6000
防止网页被嵌入框架的代码
最近,国内开始流行另一种流氓行为:使用框架(Frame),将你的网页嵌入它的网页中。 比如,有一家网站号称自己是"口碑聚合门户",提供全国各个网上论坛的精华内容。但是,其实它就是用框架抓取他人的网页,然后在上面加上自己的广告和站标,这同盗版书商有何不同?! 不明内情的访问者,只看到地址栏是该门户的URL,不知道真正内容部分的网页,其实来自另一个网站。 为什么我反对这种做法?   1)它故意屏蔽了被嵌入网页的网址,侵犯了原作者的著作权,以及访问者的知情权;   2)大量业者使用的是不可见框架,使得框架网页
ruanyf
2018/04/12
1.3K0
运营同学如何防止活动中系统扑街 ?
运营同学搞活动,最不希望看到的,恐怕就是系统扑街了。这种事情似乎没什么办法,公司程序员水平太次,总拖后腿,我能怎么办?我也很为难啊。其实,这事未必都是程序员的锅,作为运营同学,要想避免系统扑街也是有方法可以遵循的。
姬小光
2020/01/14
7230
运营同学如何防止活动中系统扑街 ?
如何修改django的app在admin中显示的名称
在django的开发中,很多时候我们希望app在admin中显示成我们想要的中文名,而不是显示默认的app_label名称。 比如我们有一个blog应用,在我们的blog app目录下面,默认会生成一个apps.py文件,类似:
小海怪的互联网
2019/09/25
3.4K0
如何修改django的app在admin中显示的名称
支付系统设计中,如何防止重复支付?
在我们支付系统设计中,经常会遇到这样一个问题,防止用户重复支付。用户明明只想购买一次,却因为系统问题,导致重复支付,带来额外的物流成本和扯皮退货的运营成本,对商家的信誉和系统的体验很不好。
金融民工小曾
2018/09/05
4.4K0
支付系统设计中,如何防止重复支付?
【干货】如何防止接口重复提交?(中)
在上一篇文章中,我们详细的介绍了对于下单流量不算高的系统,可以通过请求唯一ID+数据表增加唯一索引约束这种方案来实现防止接口重复提交!
Java极客技术
2022/12/04
1.7K0
【干货】如何防止接口重复提交?(中)
Linux服务器如何防止中木马?
Linux下的木马常常是恶意者通过Web的上传目录的方式上传木马到Linux服务器的,所以可从恶意者:访问网站-->Linux系统-->HTTP服务-->中间件-->程序代码-->数据库-->存储,层层设卡防护。
HaydenGuo
2019/12/12
2.1K0
Linux服务器如何防止中木马?
如何提取损坏的压缩包文件
作者:matrix 被围观: 4,327 次 发布时间:2020-05-19 分类:零零星星 | 2 条评论 »
HHTjim 部落格
2022/09/26
2.2K0
如何提取损坏的压缩包文件
针对SQLite3为Cocoa 和 Cocoa Touch设计的持久化对象
向大家推荐一款很不错的轻量级的Cocoa持久化对象 – sqlitepersistentobjects
EltonZheng
2021/01/22
3790
Cocoa Iphone 屏幕尺寸
1、状态栏:通常是20px高,在打电话或显式消息时,放大到40px。因此,在纵向模式下,应用程序的可用空间是320×460,横向模式下是480×300;
全栈程序员站长
2022/08/28
3910
点击加载更多

相似问题

防止COM名称损坏

11

防止Ada DLL中的名称损坏

22

C++中的名称损坏

20

如何防止django管道中javascript函数的名称损坏

27

c++中的名称修饰或名称损坏

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文