问题标签 [c11]
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 - 关于返回指向静态缓冲区的指针的函数的 C11 线程安全
考虑像localtime
C 标准库中返回指向(历史上)静态缓冲区的指针的函数。C11 是否使这些缓冲区成为线程本地的?
根据 C11 中的 7.1.4:
除非在随后的详细描述中另有明确说明,否则库函数应防止数据竞争,如下所示: 库函数不得直接或间接访问可由当前线程以外的线程访问的对象,除非通过函数的参数直接或间接访问对象. 库函数不得直接或间接修改当前线程以外的线程可访问的对象,除非这些对象是通过函数的非常量参数直接或间接访问的。如果对象对用户不可见并且受到保护以防止数据竞争,则实现可以在线程之间共享它们自己的内部对象。
例如考虑localtime
。它的struct tm
返回值指向的 似乎不符合“内部对象”的条件,因为调用者可以访问它,因此似乎localtime
在另一个线程中的调用可能不会破坏先前在第一个线程中返回的结果。这意味着localtime
需要为每个线程使用不同的缓冲区。
但是,标准没有指定返回地址的对象的生命周期结束,而且我认为没有理由在调用线程终止后继续使用它的程序struct tm
是无效的。因此,对象不能具有线程存储持续时间。
我发现实现可以满足所有要求的唯一方法是到处泄漏内存,这肯定不是预期的。我是否遗漏了一些明显的东西,或者 C11 对遗留接口的线程安全处理真的考虑得不好?
c - C11 通过 typedefs 匿名结构?
C11 标准中添加了匿名结构,因此
是有效和标准的。使用 typedef 代替完整的结构声明是否也在标准范围内?例如:
GCC 文档说这是一个 Plan 9 扩展,但是它可以在我尝试过的几个编译器中工作(包括 GCC ......)。通过我对标准本身的阅读,我认为这还可以,但这是一种很容易搞砸的仔细阅读。
c - 位域和序列点
对于打包f0
并f1
放入同一字节的实现,是否定义了以下程序?
如果有理由认为它在那里不同,我对 C99 和 C11 的答案很感兴趣。
在 C99 中,我发现的只是 6.5:2:
在前一个序列点和下一个序列点之间,对象的存储值最多只能通过表达式的评估修改一次。[...]
我不清楚这一段对上述程序有什么影响。
基于大量随机测试,大多数编译器似乎生成了两个分配不干扰的代码。
c - C11 的 __STDC_VERSION__ 值是多少?
我知道编译器__STDC__
用来表明编译器是标准 C,并且从那里,您可以__STDC_VERSION__
用来确定您正在使用的标准级别。
我也知道 C90 没有价值,C90 修正 1 有199401L
,C99 有199901L
。
最新的 C1x 草案我只是简单地陈述了它,201ymmL
并且我假设它在最终标准中被做了一个不那么“模糊”的值。
我的猜测是,这将是201112L
因为那是 C11 被批准的时候,但我想确定一下。
我以为我可以尝试使用gcc -std=c1x
,但gcc
我正在运行的版本还不支持。
有谁知道实际值是多少?
c - 是否有修改环境变量的可移植方法?
我注意到 C 标准定义了 getenv() 函数,但是 (7.22.4.2)
改变环境列表的方法[是]实现定义的。
我正在尝试让我的程序在尽可能多的托管 C 实现上工作,是否有一种很好的通用方法来检查实现是否有设置环境变量的方法以及该方法是什么,或者我是否必须采用它根据具体情况?此外,该引用的措辞向我表明,每个实现都必须有一些方法,这种理解是否正确?
c - 初始化数组/结构的语法不熟悉,求解释
我正在查看一家名为 OVP(类似于 qemu 的产品)的公司提供的“处理器建模指南”。在其中,有一个类似于以下的小代码片段:
我以前从未见过这样的语法。 删除了与 C++ 无关的内容
目前我没有能力下载/查看他们的东西来查看任何东西是如何定义的,因此我的问题。如果您认识这种语法,您可以权衡一下吗?
编辑
or1kDispatchTableC
是 type 指针的 typedef or1kDispatchTableCP
,但我仍然没有任何关于它的内容or1kDispatchTableCP
。
c - c11 _Generic 添加类型
如何向 c11 _Generic Functions 添加额外的类型?
你必须#undef/re-#define它吗?(如果是这样,下面的工作)还是有更好的方法?
c - C11中_Generic的语法和示例用法
我听说 C11 添加了泛型。我用谷歌搜索了一下,看了一些文章,知道有一个新的关键字(_Generic
)等等。但我似乎无法掌握这一切。
它是类似于 C# 中的泛型还是 C++ 中的模板?谁能给我简要解释一下泛型的 C11 定义、它的语法和一个简单的示例用法示例?
c - 支持 C11 的编译器
我想知道是否有任何编译器支持相当多的新 C11 标准。寻找通用选择等功能。
有什么建议么?
c - _Atomic 类型说明符和限定符之间的 C11 语法歧义
我正在尝试基于 N1570 为 C11 编写 lex/yacc 语法。我的大部分语法都是从信息丰富的语法摘要中逐字复制的,但是出现了一些 yacc 冲突。我已经设法解决了所有这些问题,除了一个:在将“_Atomic”用作类型说明符和用作类型限定符之间似乎存在一些歧义。
在说明符形式中,_Atomic 后面紧跟括号,所以我假设它与 C 的很少使用的语法有关,该语法允许声明符放在括号中,从而允许括号紧跟限定符。但是我的语法已经知道如何区分 typedef 名称和其他标识符,所以 yacc 应该知道区别,不是吗?
我一辈子都想不出一个实际上是模棱两可的情况。
我怀疑它是否有帮助,但这是我使用 yacc 的 -v 标志时得到的相关状态输出。“ATOMIC”显然是我对“_Atomic”的标记名称