Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >C++参考参数与C连接

C++参考参数与C连接
EN

Stack Overflow用户
提问于 2009-12-15 00:40:02
回答 5查看 3.9K关注 0票数 15

我遇到了一段正在工作的代码(使用XLC8和MSFT9编译器),其中包含一个带有C链接和引用参数定义函数的C++文件。这让我很困扰,因为引用仅限于C++。所讨论的函数是从C代码调用的,在C代码中,函数被声明为接受指向同一类型的指针参数,而不是引用参数。

简化示例

C++文件

代码语言:javascript
代码运行次数:0
复制
extern "C" void f(int &i)
{
    i++;
}

C文件

代码语言:javascript
代码运行次数:0
复制
void f(int *);

int main()
{
    int a = 2;
    f(&a);
    printf("%d\n", a);  /* Prints 3 */
}

现在,街道上的单词是,大多数C++编译器在幕后实现引用,就像一个指针。它是这样的,只是纯粹的运气,这是这段代码工作的原因,还是它在C++规范的某个地方说,当您定义一个带有引用参数和C链接的函数时,结果是什么?我没能找到这方面的任何信息。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-12-15 01:13:40

我的n3000.pdf副本(来自这里),在7.5-Linkage规范中有这样的说明。

9.从C++到用其他语言定义的对象和从其他语言定义的C++对象之间的链接是实现定义的和语言依赖的。只有在两种语言实现的对象布局策略足够相似的情况下,才能实现这种链接。

因为C和C++是不同的语言,这意味着您不能依赖普通编译器的“特性”。

较强的是同一节中的附注5(重点是地雷):

如果两个声明将具有相同名称和参数类型列表(8.3.5)的函数声明为同一命名空间的成员,或将同名的对象声明为同一命名空间的成员,并且声明给出了不同的语言链接,则程序的格式不正确;如果声明出现在不同的翻译单元中,则不需要进行诊断。

因此,我要说的是,您所做的并不能保证按照标准工作,编译器也不需要为您给出的示例打印诊断,因为声明位于不同的翻译单元中。

FYI,它“为我工作”与gcc和g++版本4.2.1雪豹。

票数 5
EN

Stack Overflow用户

发布于 2009-12-15 00:58:56

在许多情况下,但不是所有情况下,引用都可以用“自动取消引用”指针来实现。在C++标准中,任何特定的编译器都不能以这种方式处理具有C链接和引用参数的函数,因此您应该将其视为实现细节。

如果您需要在不依赖实现细节的情况下这样做,编写一个接受指针并调用函数的转发函数并不困难:

代码语言:javascript
代码运行次数:0
复制
void real_f(int& n) {
  n++;
}
extern "C" void f(int* p) { // called from C code
  real_f(*p);
}
票数 12
EN

Stack Overflow用户

发布于 2009-12-15 01:03:27

引用是对象的备用名称。从技术上讲,C中没有任何东西可以直接映射到C++引用。

引用的明显实现是(常量)指针,每次使用它时都取消引用。因此,根据编译器实现引用的方式,代码可能会工作。但这是不对的。

解决方案是编写一个C函数,它接收一个真实的对象或指向该对象的指针,然后从该对象调用C++函数。

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

https://stackoverflow.com/questions/1906000

复制
相关文章
AlpineJS作者:不上班,一年站着赚10w刀
这位老哥名叫「Caleb Porzio」,是一名全栈工程师。在离职前,他的年收入为9w刀。
公众号@魔术师卡颂
2021/08/26
1.5K0
AlpineJS作者:不上班,一年站着赚10w刀
Laravel扩展推荐:导航元素工具“Laravel Navigation”
本篇文章给大家分享一个Laravel扩展:Laravel Navigation包,介绍一下怎么利用Laravel Navigation 轻松构建站点导航元素,希望对大家有所帮助!
很酷的站长
2022/11/29
5030
Laravel扩展推荐:导航元素工具“Laravel Navigation”
Laravel Jetstream是什么以及如何入门?
Laravel Jetstream 与 Laravel 8 一起于2020年9月8日发布。
Lemon黄
2020/09/28
6.5K0
lineNumber: 6; columnNumber: 40; 文档根元素 “mapper” 必须匹配 DOCTYPE 根 “configuration”。
lineNumber: 6; columnNumber: 40; 文档根元素 “mapper” 必须匹配 DOCTYPE 根 “configuration”。
全栈程序员站长
2022/07/01
5880
JavaScript动态设置根元素的rem
说到rem自然就会想到em,我们知道em是相对于父元素的字体大小的单位,那么rem则是相对于根元素也就是元素的字体大小的单位。
刘亦枫
2020/03/19
4.2K0
Vue3 - $attrs 的几种用法(1个或多个根元素、Options API 和 Composition API)
使用 Vue 开发时,肯定会接触到 组件 的概念,无可避免的也会接触到 组件通讯 的概念。
德育处主任
2022/09/23
3.5K0
Vue3 - $attrs 的几种用法(1个或多个根元素、Options API 和 Composition API)
多个Laravel项目如何共用migrations详解
在实际开发中,我们可能经常会遇到一个项目会建立两个 Laravel 项目,一个是面向用户的 web/API,一个是管理员后台,这两个项目一般情况下是共用一个数据库的,那么我们的 migration 可以共用吗?该怎么操作?
子润先生
2021/07/13
6920
多个扇形元素绕圆旋转
这种效果有很多方案,最后选择了一个比较简单的方案,就是一个position: relative;的 div 。包裹5个position: absolute;的div。 通过旋转,调整5个div的 top 与 left,而产生弧度,并使中心点都指向圆心。 黄色扇形与文字 都是在5个div内部。
拿我格子衫来
2023/10/19
2560
多个扇形元素绕圆旋转
数据校检
数据校验的基本原理 <1> 数据校验的必要性 受元器件的质量、电路故障或噪音干扰等因素的影响,数据在被处理、传输、存储的过程中可能出现错误 若能设计硬件层面的错误检测机制,可以减少基于软件检错的代价(系统观) <2> 校验的基本原理 增加冗余码(校验位) - 有效信息(k位) 校验信息(r位) <3> 码距的概念 同一编码中,任意两个合法编码之间不同二进制位数的最小值 0011 与 0001 的码距为1,一位错误时无法识别 0000、0011、0101、0110、1001、1010、1100、1111等
ruochen
2021/05/16
7390
数据校检
如何修改Laravel中url()函数生成URL的根地址
本文主要给大家介绍了修改Laravel中url()函数生成URL的根地址的相关内容,相信大家都晓得 Larevel 的一票帮助函数中有个 url(),可以通过给予的目录生成完整的 URL,是非常方便的一个函数:
用户8449980
2021/07/13
3.4K0
一个 Vue 模板可以有多个根节点(Fragments)?
通常,我们通过在最外层包裹一层 div 来解决这个问题,但这个div元素一般没有啥使用,就是让模板符合单根需求。
前端小智@大迁世界
2020/05/12
3.4K0
c++ vector删除多个元素方法
转自:https://blog.csdn.net/daofengdeba/article/details/7865229
用户7886150
2021/01/19
2.7K0
Laravel 使用多个数据库连接
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/105853.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/09
1.4K0
Laravel 中使用 PM2 管理多个队列
接着上一篇的思路,要在 Laravel 中使用 PM2 管理多个队列,该如何操作呢
Bolton
2023/05/31
6650
我是如何通过开源项目做到年入 80 万的?
不知道你是否还记得,去年我们曾经在公众号上发布过一篇文章《我是如何通过开源项目月入 10 万的?》,里面主要讲述了知名前端开源项目 fullPage.js 作者是如何通过 GitHub 做到年入百万的事迹。
GitHubDaily
2020/06/29
9980
我是如何通过开源项目做到年入 80 万的?
竟然有人质疑我还在用Laravel开发?别忘了PHP是最好的语言。
之前写了一篇Laravel提高DB查询效率的文章,转发到群里后竟然有人质疑我说“Laravel是他好几年前用的框架,没想到现在还有人在用。”
王中阳Go
2022/10/26
2.5K0
vue的单根元素问题及解决方法
在进行vue项目开发时,难免遇到各种各样的问题,虽然这些问题和报错会打击我们的自信心,但是只要换个方位思考,问题将成为驱使我们前进的动力。下面小编将以组件模板的单一根元素问题为例,讲解如何使用问题驱动法,解决并拓展想关的问题。
算法与编程之美
2021/11/15
4380
点击加载更多

相似问题

Livewire -检测到多个根元素

11

Livewire:检测到多个根元素。这是不支持的。

15

Laravel Livewire超时

115

多个设备(实例)之间的Laravel livewire同步

114

检测到空的XML根元素

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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