Tag: c89

无符号和较大签名类型之间隐式转换的不一致行为

请考虑以下示例: #include int main(void) { unsigned char a = 15; /* one byte */ unsigned short b = 15; /* two bytes */ unsigned int c = 15; /* four bytes */ long x = -a; /* eight bytes */ printf(“%ld\n”, x); x = -b; printf(“%ld\n”, x); x = -c; printf(“%ld\n”, x); return 0; } […]

使用联合在具有共同初始序列的两个结构之间进行转换是否合法且定义良好的行为(参见示例)?

我有一个公开面向结构A和内部结构B的API,需要能够将结构B转换为结构A.以下代码在C99(和VS 2010 / C89)和C中是合法且定义良好的行为 ++ 03 / C ++ 11? 如果是,请解释是什么使它明确定义。 如果不是,那么在两种结构之间进行转换的最有效和跨平台的方法是什么? struct A { uint32_t x; uint32_t y; uint32_t z; }; struct B { uint32_t x; uint32_t y; uint32_t z; uint64_t c; }; union U { struct A a; struct B b; }; int main(int argc, char* argv[]) { U u; ubx = 1; […]

在嵌入式设备上将字节流转换为C89中的数据包流的方法

我正在研究使用rs232(通过USB连接的rs232)连接到PC的嵌入式设备。 我正在考虑开发自己的协议: 但我不想重新发明轮子。 请注意 :我正在考虑相当受限的设备:4kb的RAM,没有内核,也没有标准的C lib。 你能想到一个标准的方法来做到这一点(也许是开源库)? 如果您编写自己的解决方案,是否有任何最佳实践? 你是否也在包的末尾使用MAGIC字节? 也许最好使用时间间隔而不是分隔符? 如何在流二进制数据中找到包的开头? 也许最好使用文本协议? 更新:请重新阅读问题。 我不应该要求图书馆,而是要求良好做法。

如何找到我当前的编译器标准,如果它是C90等

我正在研究Linux机器。 是否有任何系统命令可以找到我正在使用的C编译器后面的标准?

C99的所有function是否也在C ++中?

此页面列出了C99中新增的53个function(即它们是C99但不是C89)。 所有这些function都在C ++中吗? 甚至是C ++ 98? 如果没有,哪些function在C ++中,哪些不是?

一个好的C等价的STL载体?

我注意到在我们的代码库中的几个地方,我们使用动态扩展数组,即一个与元素计数器和“max elements”值相结合的基本数组。 我想要做的是用通常的数据结构和实用程序函数替换它们,这是出于通常的面向对象的原因。 数组元素可以是基本数据类型或结构,我需要快速随机访问元素,最好是类型安全的实现。 所以,基本上,我想要使用的是STL向量,但代码库仅限于C89,所以我必须提出其他的东西:-) 我给了它一些想法并掀起了这个初稿,只是为了表明我的目标: /* Type-safe dynamic list in C89 */ #define list_declare(type) typedef struct _##type##_list_t { type * base_array; size_t elements; size_t max_size; } type##_list_t #define list(type) type##_list_t #define list_new(type, initial_size) { calloc(initial_size, sizeof(type)), 0, initial_size } #define list_free(list) free(list.base_array) #define list_set(list, place, element) if ( list.elements < list.max_size ) { list.base_array[place] […]

C中的Integral Promotion和Balancing有什么区别?

积分促销和平衡之间有什么区别。 我们可以在执行任何操作之前将任何类型转换为atleast int或unsigned int类型(逻辑运算符&&,||,!除外)以及更大类型(如果任何操作数的类型更大)比int?

strtol使用errno

我有以下代码: #include #include #include void main(void) { int data; char * tmp; data = strtol(“23ef23”,&tmp,10); printf(“%d”,errno); getchar(); } 输出为0 … 为什么? 我正在使用visual studio 2010 C ++代码必须与C89兼容。

在“r +”模式下打开时,在C中清除/截断文件

我的代码目前看起来像这样(这些步骤分为多个函数): /* open file */ FILE *file = fopen(filename, “r+”); if(!file) { /* read the file */ /* modify the data */ /* truncate file (how does this work?)*/ /* write new data into file */ /* close file */ fclose(file); } 我知道我可以在”w”模式下打开文件,但在这种情况下我不想这样做。 我知道在unistd.h / sys/types.h有一个函数ftruncate ,但是我不想使用这些函数,我的代码应该是高度可移植的(在windows上也是如此)。 是否有可能在不关闭/重新打开文件的情况下清除文件?

C语言中的表达式评估顺序

如果我有以下表达式: c = (a) * (b) C90标准对子表达式’a’和’b’的顺序评估有什么看法?