问题标签 [c17]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 什么是 C17,语言做了哪些改变?
当我查看有关 GCC 8 的新闻时,我看到他们增加了对 2017 版 C 语言(不是 C++17,实际上是 C17)的支持。但我在互联网上找不到任何关于它的信息。
它是像 C11 这样的新 ISO 版本,还是只是 GCC 团队用于在其编译器中进行一些更正的代号?
c - C17 希望我如何初始化我的原子?
C17 标准ATOMIC_VAR_INIT
从弃用stdatomic.h
,这意味着它仍然支持它,但宁愿不使用它。在 C17 中初始化原子的正确非弃用方式是什么?
与非原子类型相同:
还是新事物?
c - snprintf:是否有任何 C 标准提案/计划来更改此函数的描述?
是否有任何关于 C 语言标准的提案(或计划)来更改函数的(最后一句)描述,以便我对这个问题的回答snprintf
中描述的歧义- “snprintf() 总是空终止吗?” -解决了吗?
(或者我如何(使用哪些链接)自己确定是否有任何此类提案?
是否有任何搜索引擎可以显示有关该snprintf
功能的所有当前有效提案?
我目前知道的唯一链接是这个 - http:/ /www.open-std.org/jtc1/sc22/wg14/ - 这是我第一次对任何标准的提案有特别的想法)
c - 我们应该叫它C17还是C18?
ISO 9899:2018 已经从ISO提供了一段时间。变更清单:
尽管 ISO 文件将是 9899:2018,但这个版本的标准非正式地称为 C17。所以我想知道我们应该叫它C17还是C18。
为了不激起基于意见的答案,我的问题是:有哪些规范来源将该标准标记为“C17”或“C18”?
最规范的来源当然是 ISO 标准本身。鉴于此,为保持一致性,该标准应称为 C18:
- C90 = 9899:1990
- C99 = 9899:1999
- C11 = 9899:2011
- C1x = 9899:2018
它是在 2018 年发布的,而不是 2017 年。所以我认为我们应该称它为 C18?
虽然作为另一个例子,我知道 gcc 已经创建了一个编译器开关-std=c17
,根据this。gcc 手册有些规范。他们打算保留这个名字吗?像clang和icc这样的其他人呢?
有没有一些共识?委员会的意见?
c - i=i++ 会在 C17 中新定义吗?
在偶然发现“为什么这些构造使用前增量和后增量未定义的行为? ”这个问题后,今天我决定获取下一个 C 标准的最新草案,并阅读更多关于它的信息。
在我在 C17 草案中发现以下段落后不久:
表达式是一系列运算符和操作数,它们指定值的计算,或指定对象或函数,或产生副作用,或执行它们的组合。运算符的操作数的值计算在运算符结果的值计算之前排序
来源:ISO/IEC 9899:2017,第 6.5 节第 1 节“表达式”(链接断开使用web.archive.org)
现在我有点困惑。这不意味着这i = i++
是定义的行为吗?我看了另一个草稿,这次是 C99:
表达式是一系列运算符和操作数,它们指定值的计算,或指定对象或函数,或产生副作用,或执行它们的组合。
来源:ISO/IEC 9899:1999,第 6.5 §1 节“表达式”
就是少了那句话!
问题
- 我是不是误会了什么?
- 答案是否已过时?
- 我看错草稿了吗?
注意:这个问题是相关的,但它是关于 C++ 的。
c - windows内存格式化问题
我正在尝试使这种动态重新分配以可移植的方式工作。
我的程序接受来自用户的一行文本并将其附加到缓冲区。如果缓冲区中的文本长度为 20 或更多,它会删除前 20 个字符并将其后的任何字符移动到缓冲区的开头。
我有这段代码可以在 Linux 上运行干净,但是当我在 Windows 上运行它时会发出垃圾。有谁知道为什么/如何仅使用 malloc 使其可移植。IE 不使用 string.h(strcpy) str... 除了 len。
仅限 c17 - 没有破损的结构(不可移植)。这是我的代码。编译没有错误 gcc 7.3, mingw 7.3。我用更安全的功能替换了gets和puts,但我仍然在windows上得到垃圾。我认为这是一个格式问题...
c - 如何以可移植的方式从指向结构成员的指针计算指向结构开头的指针?
假设T1
和T2
是两种类型,并给出以下结构:
此外,假设我们有一个类型为 的对象struct s
:
由此,我们可以计算出指向对象第二个结构成员的指针:
我正在寻找的是一种可移植的方法,可以从q
指向objectp
的类型指针struct s *
进行计算。p
a
c - 是否有类似于原生 C 中的 std::lock_guard 的东西?
在 C++ 中,建议使用 lock_guard ,因为它可以确保在对象被销毁时解锁互斥锁。
有没有办法在 C 中实现相同的东西?还是我们必须手动实现它:
锁定互斥锁
对全局变量做某事
解锁互斥锁
c++ - C++17 是基于 C17 的吗?
我注意到 C++17 中的许多新特性都来自 C17。这两个标准之间有什么关系吗?C 函数和它们的 C++ 等效函数之间有什么实际区别吗?
c - C11 附件 K:“重叠的对象”
在 C 标准的 Annex K(边界检查接口)中不断出现一句话:
....复制不应发生在重叠的对象之间。
例如,考虑 ,strcpy_s( char * restrict s1, rsize_t s1max, char const * restrict s2 )
其中指定启用边界检查s1max
的最大容量。s1
此时的“对象”究竟是什么s1
,不能与“对象”重叠s2
?
会不会是...
- s1[0]..s1[s1max](到缓冲区的末尾,即内存对象),
或者
- s1[0]..s1[strnlen(s1, s1max)](到字符串的末尾,即字符串对象)?
如果是前者,我想知道缺乏一致性,因为我不知道s2缓冲区的大小,并且必须对“对象”应用不同的定义。
如果是后者,我想知道它是否不会破坏给出的“承诺”,因为可以想象,如果源字符串比原始字符串长,源字符串和最终(复制后)目标字符串可能会重叠。
这里“对象”的意图/预期定义是什么?