Tag: c11

thrd_busy和mtx_lock()/ mtx_timedlock()

我有关于C1x互斥量的以下问题(§7.25.4): 在哪种情况下mtx_lock()返回thrd_busy而不是阻塞? 在哪些情况下mtx_timedlock()返回thrd_busy ? 请注意, thrd_busy在§7.25.1¶5中定义为“ 当测试和返回函数请求的资源已被使用时 ”。 我希望thrd_busy只能由mtx_trylock()返回,或者当用mtx_try或mtx_try | mtx_recursive调用时,最多也只能由mtx_trylock()返回mtx_try | mtx_recursive mtx_try | mtx_recursive互斥锁,但绝对不是来自mtx_timedlock() ,它需要一个支持超时的互斥锁,即mtx_timed或mtx_timed | mtx_recursive mtx_timed | mtx_recursive互斥。 这只是草案中的公正和疏忽吗? 或者我错过了什么?

isspace()是否接受getchar()值?

如果输入可表示为unsigned char或等于EOF则isspace()有效。 getchar()从stdin中读取下一个字符。 当getchar()!=EOF ; 所有getchar()返回的值都可以表示为unsigned char吗? uintmax_t count_space = 0; for (int c; (c = getchar()) != EOF; ) if (isspace(c)) ++count_space; 愿这段代码导致未定义的行为吗?

是否有推荐的整数类型来存储标准C中的函数指针

C99标准有uintptr_t ,一种推荐的整数类型,用于将数据指针(指向对象的指针)转换为,但是我找不到用于存储函数指针的等效整数类型。 我忽略了吗? 特定编译器可以定义这样的类型,即使它不在标准中,但编译器更可能声明函数指针可以存储在(比如说) uint64_t不是定义新类型。 另一个不同之处在于,对数据指针执行整数运算是有意义的,而不是在函数指针上。 一个常见的习语是(int*)(((uintptr_t)p + 15) & ~(uintptr_t)15)但是没有理由将这个习语应用于函数指针。

组合_Generic宏

我对C11的_Generic机制很满意 – 切换类型是我从C ++中遗漏的东西。 然而,certificate难以撰写。 举个例子,给定函数: bool write_int(int); bool write_foo(foo); bool write_bar(bar); // bool write_unknown is not implemented 我可以写 #define write(X) _Generic((X), \ int : write_int, \ foo: write_foo, \ bar: write_bar, \ default: write_unknown)(X) 并且,如果我不尝试使用&写入或将其传递给函数,我可以调用write(obj),并且,如果obj是其中一种类型的实例,一切都很好。 然而,一般来说,foo和bar彼此完全无关。 它们在不同的头文件中定义,很少(但偶尔)在单个源文件中一起使用。 然后应该在哪里写宏扩展到_Generic? 目前,我正在积累一些名为write.h,equal.h,copy.h,move.h的头文件,每个文件包含一组函数原型和一个_Generic。 这是可行的,但并不精彩。 我不喜欢在一个地方收集程序中每种类型的列表的要求。 我希望能够在头文件中定义类型foo,以及函数write_foo,并且以某种方式使客户端代码能够调用’function’。 默认看起来像一个矢量,通过它可以实现这一点。 我在这个网站上找到的最接近的匹配是c11generics添加类型 ,它有一个部分解决方案,但是我不太了解如何组合各种宏。 让我们说,在定义write_bar的头文件中的某个地方,我们有一个现有的宏定义: #define write(x) _Generic((x), bar: write_bar, default: some_magic_here)(x) 或者我们可以省略尾随(x) […]

实现可以指定未定义的行为

3.4.1 1实现定义的行为 未指定的行为,其中每个实现记录了如何进行选择 实现是否可以指定,在未定义的行为是可能的结果的情况下,实现定义的行为是未定义的行为? 例如: 6.3.1.3有符号和无符号整数 3否则,新类型已签名且值无法在其中表示; 结果是实现定义的,或者引发实现定义的信号。 因此,只要记录在案,这个结果是否可以由实现未定义并导致未定义的行为,或者它必须具有该实现的定义结果?

符合标准的字符串是否可以长于SIZE_MAX字符?

我没有在C11标准中找到任何声明字符串不能超过SIZE_MAX (其中SIZE_MAX表示size_t类型的最大值)字符的任何内容。 例如,如果size_max很long ,并且在我的实现中有一个long long类型,它严格地大于long ,那么我可以使用long long定义和索引这样的字符串。 但是,这意味着一些不寻常的情况:例如, strlen可能无法返回字符串的实际大小,因为结果将在结尾处转换为size_t ,因此将报告长度为SIZE_MAX+1的字符串为例如,大小为0。 例如,这会违反标准,从而防止这些字符串存在吗? 作为参考,7.24.6.3仅表示: 7.24.6.3 strlen函数 概要 #include size_t strlen(const char *s); 描述 strlen函数计算s指向的字符串的长度。 返回 strlen函数返回终止空字符前面的字符数。 我是否遗漏了某些东西,或者这对C11(符合标准的实施)是否完全有效?

指向匿名联合的指针是否在C11中有效?

const Boo *constBoo; Boo *nonConstBoo; nonConstBoo = ((union {const Boo *_q; Boo *_nq;})constBoo)._nq; 以上构造在C11中是有效的,还是只有GCC / clang扩展可以以这种方式将指针强制转换为匿名联合? 如果它无效,还有其他方法可以在有效的C11代码中编写等效表达式吗? 目的是模拟C ++ const_cast,它将与C11兼容并提供一些基本类型的安全性。 从const到非const指针的显式转换将使用-Wcast-qual选项触发警告,这是不合需要的。

枚举值是在预处理时间还是在编译时解决的?

枚举值何时解析? 换句话说,以下代码片段是否符合标准? enum{ A, B, MAX } #if MAX > 42 # error “Woah! MAX is a lot!” #endif

关于指针比较,标准中的措辞比较奇怪

§6.5.8\ 6 (关于>,<, =) 如果表达式P指向数组对象的元素并且表达式Q指向同一数组对象的最后一个元素,则指针表达式Q + 1比P大。 在所有其他情况下,行为未定义。 上面的几节,§6.5.8,它解释了基本上,指针算法在数组上按预期工作。 这是int a[3]; int *p = a; int *q = &a[2]; //qp == 3 int a[3]; int *p = a; int *q = &a[2]; //qp == 3 int a[3]; int *p = a; int *q = &a[2]; //qp == 3有效。 但是,当我读到上面的q > p是UB。 我错过了什么?

是否有一个与char16_t一起使用的strlen()?

正如问题所说: typedef __CHAR16_TYPE__ char16_t; int main(void) { static char16_t test[] = u”Hello World!\n”; printf(“Length = %d”, strlen(test)); // strlen equivalent for char16_t ??? return 0; } 我搜索并发现只有C ++解决方案。 我的编译器是GCC 4.7 。 编辑: 为了澄清,我正在寻找一种解决方案,它返回code points的数量,而不是characters 。 对于包含BMP之外字符的UTF-16字符串,这两者完全不同。