问题标签 [c89]
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++ - 是否有任何理由使用 C 而不是 C++ 进行嵌入式开发?
问题
我的硬件 C++ 和 C89 上有两个编译器
我正在考虑将 C++ 与类一起使用但没有多态性(以避免 vtables)。我想使用 C++ 的主要原因是:
- 我更喜欢使用“内联”函数而不是宏定义。
- 我想使用名称空间,因为我的前缀会使代码混乱。
- 我认为 C++ 类型更安全,主要是因为模板和详细的转换。
- 我真的很喜欢重载的函数和构造函数(用于自动转换)。
在为非常有限的硬件(4kb 的 RAM)进行开发时,您是否认为有任何理由坚持使用 C89?
结论
谢谢你的回答,他们真的很有帮助!
我想通了这个主题,我会坚持使用 C,主要是因为:
- 用 C 语言预测实际代码更容易,如果您只有 4kb 的内存,这一点非常重要。
- 我的团队主要由 C 开发人员组成,因此不会经常使用高级 C++ 功能。
- 我找到了一种在我的 C 编译器 (C89) 中内联函数的方法。
很难接受一个答案,因为您提供了这么多好的答案。不幸的是,我无法创建一个 wiki 并接受它,所以我会选择一个让我思考最多的答案。
c - 一种在嵌入式设备上将字节流转换为 C89 中的数据包流的方法
我正在使用使用 rs232(通过 USB 的 rs232)连接到 PC 的嵌入式设备。
我正在考虑开发自己的协议:
<MAGIC><LENGTH><BINARY DATA><CRC>
但我不想重新发明轮子。
请注意:我正在考虑非常受限的设备:4kb 的 RAM,没有内核,也没有标准的 C 库。
你能想出一个标准的方法来做到这一点(也许是开源库)?
如果您编写自己的解决方案,是否有任何最佳实践?
- 您是否也在包的末尾使用 MAGIC 字节?
- 也许使用时间间隔而不是分隔符更好?
- 如何在流二进制数据中找到包的开头?
- 也许使用文本协议更好?
更新: 请重新阅读问题。我不应该要求图书馆,而是要求良好的做法。
c - 在 MinGW 3.4.5 中使用 -ansi 开关的问题
我正在阅读 gcc 中使用的标志,并阅读了使用gcc -ansi -pedantic -Wall file1 [file2 [file3...]] -o output
. 为了我的代码质量,保持它的标准,并得到所有关于它的警告。
好吧,关于使用 -ansi 编译...如果我包含<stdlib.h>
,gcc 会给我这个错误:
In file included from ansi.c:2:
C:/c/bin/../lib/gcc/mingw32/3.4.5/../../../../include/stdlib.h:317: error: syntax error before "double"
那一行是这样的:
在 C中不inline
存在?“标准”标题不应该是标准 ansi 吗?我应该删除内联还是避免使用 stdlib.h 编译(我现在真的不记得 stdlib 中有什么了)?
更新
通过阅读 Adam 发布的链接,我发现“inline”不是 C89 中的关键字,而 C89 是使用 -ansi 开关强制执行的。我不得不把它改成__inline__
一个 MinGW 宏。
谢谢您的帮助。
c - 通过函数分配数据 (ANSI C)
我很想知道如何通过函数分配数据,并且在函数返回后数据仍然被分配。这既适用于基本类型(int、char**)也适用于用户定义类型。下面是两个代码片段。两者都在函数内进行分配,尽管在返回之后分配进行。
用户定义类型的行为与以前相同:
有任何想法吗?我想我需要将指针作为参考传递,但我该怎么做?
在此先感谢,防晒霜
c - 在启用换行的情况下将终端光标返回到行首
我正在编写一个过滤器(在一个用于终端输出的管道中),有时需要“覆盖”刚刚发生的一行。它的工作原理是逐个字符地将标准输入传递给标准输出,直到\n
达到 a,然后调用特殊行为。我的问题是如何返回到行首。
我首先想到的是使用 a\r
或 ANSI 序列\033[1G
。但是,如果行长到足以在终端上换行(并因此导致它滚动),这些只会将光标移回当前物理行。
我的第二个想法是跟踪行的长度(自上一个以来传递的字符数\n
),然后\b
多次回显。但是,如果该行包含控制字符或转义序列(可能还有 Unicode?),就会出错。
缺少搜索所有特殊序列并使用它来调整我的字符数,有没有一种简单的方法来实现这一点?
c - 将结构指针增加一半的结构大小
我刚刚处理了一个有趣的问题,但我看不出有什么巧妙的方法来解决它。
我有两个表示复杂图形的基本数据结构,声明如下:
实际节点紧跟在标题之后,因此通常使用以下命令创建“graph_t”
并且访问“原始”节点数组
现在,有一个支持函数在减少节点数量的缓冲区上运行。它看起来像这样:
现在,这已经很好地工作了很长时间。上面的任何错误都源于我是凭记忆写的,我只是想解释一下这个想法。
现在让我感到困惑的是,当使用新模块的缩减功能时,输入没有“正确”对齐。当我检查地址时,我注意到以下属性:
当然,这会导致一些问题,因为“偏移”值变得不正确,但这并不那么明显,因为数据结构的所有其他使用都有效(没有“真正的”对齐问题)。
这归结为我的问题 - 当偏移量不能表示为元素的整数时,您是否看到增加指针的一种巧妙方法?
找到一种不诉诸过度施法的方法的奖励积分:)
c - 人们使用什么技术/策略在 C(不是 C++)中构建对象?
我对打算在 C 中使用的对象特别感兴趣,而不是构成解释语言(如 python)核心的对象实现。
c - 为什么要使用 strncpy 而不是 strcpy?
编辑:我已经添加了示例的源代码。
我遇到了这个例子:
产生了这个输出:
这让我想知道为什么有人会想要这种效果。看起来会很混乱。这个程序让我觉得你基本上可以用 Tom Bro763 复制某人的名字(例如 Tom Brokaw)。
使用 strncpy()
over strcpy()
有什么好处?
c - ANSI C 中的无缓冲 I/O
为了教育和编程实践,我想编写一个简单的库,可以处理原始键盘输入,并“实时”输出到终端。
我想尽可能地坚持使用 ansi C,我只是不知道从哪里开始这样的事情。我已经进行了几次谷歌搜索,99% 的结果使用库,或者用于 C++。
我真的很想让它在 Windows 中运行,然后在我有时间的时候将它移植到 OSX。
c - 堆栈上的动态内存分配
我最近尝试了这个实验,我没有为未知大小的内存需求进行动态内存分配,而是进行了静态分配。当我声明一个数组a[i]
时,我保留i
了(数组的大小)变量并依赖于用户提供的输入。
我的问题是:
- 这样的操作合法吗?
- 如果不是,为什么编译器不发出任何警告或错误?
- 该内存将分配到哪里:堆栈还是堆?
- 为什么 ANSI C/GCC 允许这样做?