我必须定义一个24位数据char[3]
类型.我用来表示类型.我可以的typedef char[3]
来type24
?我在代码示例中尝试过它.我输入typedef char[3] type24;
了我的头文件.编译器没有抱怨它.但是当我void foo(type24 val) {}
在我的C文件中定义一个函数时,它确实抱怨了.我希望能够定义type24_to_int32(type24 val)
代替的函数type24_to_int32(char value[3])
.
我的印象是访问union
除最后一个成员之外的成员是UB,但我似乎无法找到一个可靠的参考(除了声称它是UB但没有标准支持的答案).
那么,这是不确定的行为?
(声明:我已经看到了这个问题,我不是重新问了-我很感兴趣,为什么代码工作,而不是在如何它的工作原理.)
所以,这里的这个实现苹果的(当然,FreeBSD的)strlen()
.它使用一个众所周知的优化技巧,即它一次检查4或8个字节,而不是与0进行逐字节比较:
size_t strlen(const char *str)
{
const char *p;
const unsigned long *lp;
/* Skip the first few bytes until we have an aligned p */
for (p = str; (uintptr_t)p & LONGPTR_MASK; p++)
if (*p == '\0')
return (p - str);
/* Scan the rest of the string using word sized operation */
for (lp = (const unsigned long *)p; ; lp++)
if ((*lp - mask01) …
Run Code Online (Sandbox Code Playgroud) 我回答了对我的回答的评论:C求职面试 - 演员和比较,发现我找不到C++认为"实施定义行为"的完整列表.我知道这类事情有3个类别:未定义的行为,实现定义的行为和未指定的行为; 然而,似乎大多数讨论都围绕未定义的行为,并且当讨论实现定义的行为时,最多给出一个例子.一般来说,我倾向于编写很多代码来捕获这个区域,我知道会发生什么样的行为; 我仍然希望能够对其有效性发表评论.我还想抛弃那里,我认为操作社区中有很多误诊是未定义的,而实际上它们是由平台很好地定义的.
请注意,我对给定平台如何选择定义此类行为并不感兴趣,而是对包含C++标准定义的"实现定义"类别中的所有行为的列表感兴趣.