Tag: c11

是(x ++,y)+(y ++,x)未定义或未指定,如果未指定,它可以计算什么?

逗号序列运算符在表达式中引入序列点 。 我想知道这是否意味着下面的程序避免了未定义的行为。 int x, y; int main() { return (x++, y) + (y++, x); } 如果它确实避免了未定义的行为,它仍然可能未指定,即返回几个可能值中的一个。 我认为在C99中,它只能计算1 ,但实际上,各种版本的GCC将这个程序编译成一个返回2的可执行文件。 Clang生成一个返回1的可执行文件,显然与我的直觉一致。 最后,这是C11改变了吗?

可以在ARM Cortex M4中安全地省略DMB指令

我正在浏览GCC为ARM Cortex M4生成的程序集,并注意到atomic_compare_exchange_weak在条件周围插入了两条DMB指令(使用-std=gnu11 -O2编译为GCC 4.9): // if (atomic_compare_exchange_weak(&address, &x, y)) dmb sy ldrex r0, [r3] cmp r0, r2 itt eq strexeq lr, r1, [r3] cmpeq.w lr, #0 dmb sy bne.n … 由于ARM Cortex M4屏障指令的编程指南声明: 在图41和图42的示例中省略DMB或DSB指令不会导致任何错误,因为Cortex-M处理器: 不要重新排序内存传输 不允许两个写传输重叠。 在针对Cortex M时,是否有任何理由无法删除这些指令?

C – 无法访问地址处的内存

调试GDB时告诉我以下错误: 0x800c99ed00000001 如果在调试时调用ConvertByteArrayToFloat时放置断点,则会产生错误。 但该程序没有问题退出并给我一个好的结果? 我的主要档案: #include “Local.h” int main(void) { if(HandleReceivedMessages() == OP_COMPLETED){ printf(“Main Completed \n” ); } else { printf(“Main Failed \n”); } return 0; } Local.h #ifndef LOCAL_H_ #define LOCAL_H_ #include “Common.h” T_OP_STATUS HandleReceivedMessages(void); #endif Local.c #include “Handler.h” #include “Local.h” uint8_t message[] = {0x86, 0x9a, 0xa0, 0x00, 0x00, 0x01, 0x01, 0x07, 0x00, 0x10, […]

C:如何使数组的大小动态化?

我从书中读到:«C Primer Plus»告诉我C99标准,可以使用如下的语法: int b=4; char a[b]; 但是当我把这段代码放入vs2013时,它告诉我“表达式必须有一个常量值”。 这本书错了吗? 或者有一些我不知道的关于vs2013的新function?

仅在使用vararg省略号时,函数指针“从不兼容的指针类型分配”

我知道声明一个没有参数列表的函数(或函数指针)(并且在参数列表中没有指定void ),这意味着函数(或函数指针)具有未知数量的参数。 我写了一些测试脚本来检查这种行为: int my_func_1() { return(0); } int my_func_2(int x) { return(x); } int my_func_3(char x, …) { va_list va; va_start(va, x); return(va_arg(va, int)); } int (*fp)(); fp = my_func_1; printf(“%d\n”, fp()); fp = my_func_2; printf(“%d\n”, fp(33)); fp = my_func_3; printf(“%d\n”, fp(33, 44)); 我在linux下的64位机器上编译了这样的: gcc test.c -Wextra -pedantic -std=c1x -O3 -o test 输出是正确的: 0 […]

C11是否允许函数中任何位置的变量声明?

C11标准(注意我不是指C ++ 11)是否允许您在函数中的任何位置声明变量? 以下代码在ANSI C(C89,C90)中无效: int main() { printf(“Hello world!”); int a = 5; /* Error: all variables should be declared at the beginning of the function. */ return 0; } 它是C11中的有效源代码吗?

sizeof应用于数组类型

c11标准说尺寸, “当应用于具有数组类型的操作数时,结果是数组中的总字节数” (6.5.3.4,子弹4)。 脚注(103)说: “当应用于声明具有数组或函数类型的参数时,sizeof运算符会产生调整后的(指针)类型的大小”。 我从中可以看出,当应用于数组类型时,sizeof给出了数组的大小(元素的数量x元素的大小),但是应用于声明为具有数组类型的参数,它给出了指针的大小。 我的问题: 由于脚注,如何使数组类型的对象不会产生指针的大小? 在不知情的情况下,我觉得在某些情况下我无法信任sizeof运算符。 谢谢。 编辑:我想我应该澄清我的担忧,如果定义了“int a [4]”,那么我从响应中看到a == 4 * sizeof(int)的sizeof,但是sizeof(a + 0)呢? 看来sizeof(a + 1)必须被评估为指针。 我担心除了函数调用之外的情况,其中数组衰减到指针。

c11 _Generic添加类型

如何为c11 _Generic Functions添加额外的类型? 你需要#undef / re- #define吗?(如果有以下工作的话)或者有更好的方法吗? #define to_str(X) _Generic((X), \ long double: ld_str, \ double: d_str, \ float: f_str, \ )(X) #undef to_str #define to_str(X) _Generic((X), \ long double: ld_str, \ double: d_str, \ float: f_str, \ int: i_str, \ )(X)

当前的C11实施状态()?

我很好奇C11实现的状态是什么,特别是关于可选的 。 目前是否有任何平台支持这些接口? 如果没有,是否有任何计划在POSIX和/或WinAPI方面实现接口? 是否有其他人计划使用C11中描述的接口( thrd_t , mtx_t , cond_t等等)?

是使用未定义的任何不确定值还是仅存储在具有自动存储的对象中的值?

根据C99 J.2,在以下情况下行为未定义: 具有自动存储持续时间的对象的值在不确定时使用 那么对象具有不确定值的所有其他情况呢? 如果我们使用它们,我们是否也总是调用UB? 或者我们只在它们包含陷阱表示时调用UB? 例子包括: 使用malloc分配的对象的值(7.20.3.3p2) [存储在非自动存储器中]调用fclose后的FILE* (7.19.3p4) [存储在非自动存储器中]一个指针后free调用它(6.2.4p2) …等等。 我已将C99用于我的参考文献,但您可以在答案中自由引用C99或C11。