Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >函数,而不调用不兼容类型的原型。

函数,而不调用不兼容类型的原型。
EN

Stack Overflow用户
提问于 2019-03-29 06:03:18
回答 1查看 323关注 0票数 6

我阅读了标准N1570部分的6.5.2.2 Function calls,对包含prototype的函数类型的特殊含义感到困惑。精确6.5.2.2(p6)

如果函数是用不包含原型的类型定义的,且升级后的参数类型与升级后的参数类型不兼容,则行为是未定义的,但下列情况除外: -一种晋升类型是有符号整数类型,另一种晋升类型是对应的无符号整数类型,这两种类型的值都是可表示的; -这两种类型都是指向字符类型或空号的限定或非限定版本的指针。

6.5.2.2(p7)提供了一个使用prototype调用函数的规则:

如果表示被调用函数的表达式具有包含原型的类型,则参数将被隐式转换,就像通过赋值一样,转换为相应参数的类型,将每个参数的类型视为其声明类型的不合格版本。

请考虑以下示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct test_arg{
    int a;
};

void test_no_prototype(const struct test_arg a){ }

void test_with_prototype(const struct test_arg a);

void test_with_prototype(const struct test_arg a){ }

int main(){
    struct test_arg test = {.a = 42};
    test_no_prototype(test);   //1 UB?
    test_with_prototype(test); //2 Fine?
}

我认为1是UB,因为test_no_prototype不包括prototype,而test有不合格的struct test_arg版本,但是该参数有类型const struct test_arg,由于不同的限定条件,它与struct test_arg不兼容。

我认为2很好,因为test_with_prototype包括prototype,来自6.5.16.1(p1)的简单赋值约束允许从同一结构的非限定版本分配给限定结构类型的变量。

这似乎很奇怪,就目前而言,我无法想象为什么我们会以不同的方式对待有和没有原型的函数。也许我不正确地理解了规则..。如果是的话,你能解释一下这是什么意思吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-29 06:09:36

原型一词并不是指在其定义之前的函数声明。它指的是一个函数声明其参数类型的声明(C 2018 6.2.1 2)。

test_no_prototype有一个原型,因为void test_no_prototype(const struct test_arg a){ }声明了它的参数const struct test_arg的类型。

没有原型的声明的一个例子是void test_no_prototype();。这是一种旧的声明样式,不应在新代码中使用。

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

https://stackoverflow.com/questions/55419145

复制
相关文章
IBM WebSphere MQ 系列(三)配置和使用WebSphere MQ
配置和使用WebSphere MQ A.设置环境变量   在shell中执行MQ的控制命令:     ctrmqm     strmqm   若识别这些命令,则说明PATH环境变量已配置好了;   若提示找不到命令,则说明需配置Linux环境变量,指定MQ的bin路径到PATH:      可选择修改系统的环境变量(/etc/profile文件,对全部用户可见),      或只修改用户mqadmin的环境变量(/var/mqm/.bash_profile,只对当前用户可见。     下面列出前者的修改方式
Java学习123
2018/05/16
6.4K0
WebSphere MQ基础命令
基础概念 对于MQ,我们需要知道4个名词:队列管理器、队列、消息、通道;对于编程设计人员,通常更关心消息和队列,对于维护管理人员,通常 会更关心队列管理器和通道。如果我们把队列管理器比作是数据库,那么队列就是其中的一张表,消息就是表中的一条记录。 队列:我们可以简单地把队列看成一个容器,用于存放消息。 队列管理器:队列管理器构建了独立的 MQ 的运行环境,它是消息队列的管理者,用来维护和管理消息队列。 消息:MQ中的最小对象;默认情况下,消息缺省可以达到 4MB。消息可以分成持久消息和非持久消息。所谓“持久
Java学习123
2018/05/16
2.7K0
IBM WebSphere MQ 系列(二)安装MQ
一、安装WebSphere MQ之前Linux系统的配置 1.创建MQ安装目录   shell命令:  mkdir /opt/mqm   //创建安装目录  mkdir /var/mqm   //创建工作目录   2.创建MQ用户和用户组   MQ通过Linux本地的用户和用户组来管理MQ服务器,mqm用户组的下属用户成员均为MQ管理员,具有MQ服务器的全部权限。   用户组的名称必须是:mqm   用户名称可自定义,假设为:mqadmin   以root登录Linux   shell命令:     gr
Java学习123
2018/05/16
4.6K0
IBM WebSphere MQ检索邮件
如果在使用IBM WebSphere MQ的InterSystems IRIS接口时遇到问题,应该首先确定客户端是否安装正确并且可以与服务器通信。要执行这样的测试,可以使用IBM WebSphere MQ提供的示例程序。可执行文件位于IBM WebSphere MQ客户端的bin目录中。
用户7741497
2022/07/04
1.8K0
IBM WebSphere MQ 系列(四) 使用MQ命令
结合上节使用到的MQ命令,本节系统阐述MQ的命令。 一、MQ命令集合     MQ命令集合有三种命令:控制命令、MQSC(MQ脚本命令)和PCF(Programmable Command Formats,可编程的命令格式)。 二、控制命令     控制命令:用于管理 WebSphere MQ的系统配置,包括队列管理器、侦听器、通道、日志的管理。     例如:创建队列管理器(crtmqm),启动队列管理器(strmqm),启动用于运行队列管理器MQSC命令的控制台(runmqsc)、运行通道(runmqch
Java学习123
2018/05/16
4.4K0
IBM WebSphere MQ 7.5基本用法
一、下载7.5 Trial版本 http://www.ibm.com/developerworks/downloads/ws/wmq/ 这是下载网址,下载前先必须注册IBM ID,下载完成后一路Next即可(注:windows上安装时,会询问是否域环境,初次学习时,为简单起见,建议选择No) 安装完成后,MQ的Bin目录会自动添加到环境变量Path中,以后就可以直接用Dos命令行窗口操作(当然,也可以用图形化GUI方式通过IBM WebSphere MQ Explorer来管理) 注:安装时,强烈建议用管理
菩提树下的杨过
2018/01/24
3.6K0
IBM WebSphere MQ 7.5基本用法
配置IBM WEBSPHERE MQ触发器
配置IBM WEBSPHERE MQ触发器 2007-11-15 创建 一般设置MQ触发器的目的有两种, 一是自动启动发送端通道, 二是监视队列消息, 一旦发现新的消息, 则利用触发器启动相应的处理进程 如果是利用触发器自动启动发送端通道, 使用方法1, 如果是利用触发器启动用户进程, 使用方法2 方法1 A 在传输通道上设置触发器, 打开触发器控制, 类型为"第一个" B 初始队列为SYSTEM.CHANNEL.INITQ, 该队列为MQ专用的通道启动队列, 不需要手工启动其触发监视器 C 触发器数据为发
Java学习123
2018/05/16
1.9K0
发送和接收IBM WebSphere MQ消息
InterSystems IRIS为IBM WebSphere MQ提供了一个接口,可以使用该接口在InterSystems IRIS和IBM WebSphere MQ的消息队列之间交换消息。要使用此接口,必须能够访问IBM WebSphere MQ服务器,并且IBM WebSphere MQ客户端必须与InterSystems IRIS在同一台计算机上运行。
用户7741497
2022/07/04
2.9K0
延迟队列MQ
延时队列,队列内部是有序的,最重要的特性就体现在它的延时属性上,延时队列中的元素是希望在指定时间到了以后或之前取出和处理,简单来说,延时队列就是用来存放需要在指定时间被处理的元素的队列。
一个风轻云淡
2022/11/13
1.1K0
延迟队列MQ
IBM WebSphere MQ 系列(一)基础知识
一、中间件    中间件处于应用软件和系统软件之间,是一种以自己的复杂换取企业应用简单化的可复用的基础软件。    在中间件产生以前,应用软件直接使用操作系统、网络协议和数据库等开发,开发者不得不面临许多很棘手的问题,如操作系统的多样性,繁杂的网络程序设计和管理,复杂多变的网络环境,数据分散处理带来的不一致性,性能和效率、安全问题等等。这些问题与用户的业务没有直接关系,但又必须解决,耗费了大量有限的时间和精力。于是,有人提出将应用软件所要面临的共性问题进行提炼、抽象,在操作系统之上再形成一个可复用的部分,供
Java学习123
2018/05/16
5.1K0
mq消息队列的作用
我们在工作中,经常用到各自各样的mq消息队列中间件,今天我们来学习一下为什么需要用消息队列,用了对我们的好处是什么?
灬沙师弟
2023/03/07
1.2K0
mq消息队列的作用
消息队列MQ
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
chenchenchen
2019/10/22
1.8K0
消息队列MQ
mq监听死信队列后如何处理
昨天试了半天为啥监听不到死信队列的消息,原因是打开方式不对,还有死信队列就一条消息,没意思。
疯狂的KK
2020/09/14
1.5K0
消息队列简介(MQ)
消息队列是一种异步的服务间通信方式,适用于无服务器和微服务架构。消息在被处理和删除之前一直存储在队列上。每条消息仅可被一位用户处理一次。消息队列可被用于分离重量级处理、缓冲或批处理工作以及缓解高峰期工作负载。
终身幼稚园
2019/07/19
2.2K0
消息队列简介(MQ)
消费端如何保证消息队列MQ的有序消费
消息队列,既然是队列就能保证消息在进入队列,以及出队列的时候保证消息的有序性,显然这是在消息的生产端(Producer),但是往往在生产环境中有多个消息的消费端(Consumer),尽管消费端在拉取消息时是有序的,但各个消息由于网络等方面原因无法保证在各个消费端中处理时有序。
Java_老男孩
2019/12/02
8620
消费端如何保证消息队列MQ的有序消费
消息队列,既然是队列就能保证消息在进入队列,以及出队列的时候保证消息的有序性,显然这是在消息的生产端(Producer),但是往往在生产环境中有多个消息的消费端(Consumer),尽管消费端在拉取消息时是有序的,但各个消息由于网络等方面原因无法保证在各个消费端中处理时有序。
用户1148394
2019/07/31
1.6K0
消费端如何保证消息队列MQ的有序消费
IBM MQ运维使用手册
操作系统版本:SUSE Linux Enterprise Server 10 SP4    32bit
loong576
2019/09/10
8K0
IBM MQ运维使用手册
线程池数量以及队列长度如何分配?
首先我们几乎可以忽略队列本身占内存的情况,主要考虑多线程取队列数据竞争问题以及线程数量
名字是乱打的
2021/12/24
1K0
IBM MQ运维使用手册
操作系统版本:SUSE Linux Enterprise Server 10 SP4    32bit
星哥玩云
2022/07/20
3.3K0
IBM MQ运维使用手册
【消息队列 MQ 专栏】消息队列之 Kafka
Kafka 最早是由 LinkedIn 公司开发一种分布式的基于发布/订阅的消息系统,之后成为 Apache 的顶级项目。主要特点如下:
芋道源码
2018/07/31
4K0
【消息队列 MQ 专栏】消息队列之 Kafka

相似问题

如何获取-抑制WebSphere MQ队列?

25

如何从WebSphere MQ监控现有队列?

28

WebSphere MQ队列创建

11

将Websphere 5.1 MDB连接到JBoss MQ队列

12

使用Ruby连接到Websphere MQ队列进行测试

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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