You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从C++向C传递基本类型引用是否属于未定义行为?

关于C++向C函数传递基本类型引用的行为疑问

我想了解从C++向C传递int或float等基本类型引用的行为:被调用的C函数期望接收int类型,但我传入int&,这种行为是否有明确定义?

编译器显然能识别类型不匹配,但即使开启所有警告也未收到提示。这是否是因为在表达式求值时int&被当作int处理?

我尝试运行以下代码,未得到任何错误或警告,编译器直接通过,程序输出了预期的42,但这是因为编译器兼容处理,还是该操作本身合法?

测试代码

foo.h

#ifdef __cplusplus
extern "C" {
#endif

void foo(int x);

#ifdef __cplusplus
}
#endif

foo.c

#include "foo.h"
#include <stdio.h>

void foo(int x) {
    printf("%d\n", x);
}

main.cpp

#include "foo.h"

int main()
{
    int i = 42;
    int& r = i;
    foo(r);
}

解答

这种行为是完全合法且符合C++标准定义的,并非编译器的兼容处理。

原因在于:在C++表达式中使用引用变量时,会自动发生隐式的左值到右值转换(即自动解引用),引用会被当作它所绑定的对象本身来处理。当你把int&类型的r传给期望int参数的函数时,编译器会自动将引用转换为它指向的int对象的值,相当于你传递的是i本身的副本——这和直接调用foo(i)的效果完全一致。

至于为什么没有警告,根本原因是这里不存在类型不匹配:在函数调用的参数求值阶段,int&已经被转换为int类型,和C函数foo的参数类型完全匹配,所以编译器不会发出任何警告。

C++标准明确规定,引用在表达式中使用时,会被视为其绑定的对象的别名,除了少数特殊场景(比如使用decltype或者取地址操作&r),其他情况下引用都会被自动解引用为对应的对象类型。

内容的提问来源于stack exchange,提问作者Gideon Geier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 02:39:56