问题标签 [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.

0 投票
29 回答
52850 浏览

c++ - 是否有任何理由使用 C 而不是 C++ 进行嵌入式开发?

问题

我的硬件 C++ 和 C89 上有两个编译器

我正在考虑将 C++ 与类一起使用但没有多态性(以避免 vtables)。我想使用 C++ 的主要原因是:

  • 我更喜欢使用“内联”函数而不是宏定义。
  • 我想使用名称空间,因为我的前缀会使代码混乱。
  • 我认为 C++ 类型更安全,主要是因为模板和详细的转换。
  • 我真的很喜欢重载的函数和构造函数(用于自动转换)。

在为非常有限的硬件(4kb 的 RAM)进行开发时,您是否认为有任何理由坚持使用 C89?

结论

谢谢你的回答,他们真的很有帮助!

我想通了这个主题,我会坚持使用 C,主要是因为:

  1. 用 C 语言预测实际代码更容易,如果您只有 4kb 的内存,这一点非常重要。
  2. 我的团队主要由 C 开发人员组成,因此不会经常使用高级 C++ 功能。
  3. 我找到了一种在我的 C 编译器 (C89) 中内联函数的方法。

很难接受一个答案,因为您提供了这么多好的答案。不幸的是,我无法创建一个 wiki 并接受它,所以我会选择一个让我思考最多的答案。

0 投票
3 回答
6028 浏览

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

我正在使用使用 rs232(通过 USB 的 rs232)连接到 PC 的嵌入式设备。

我正在考虑开发自己的协议:

<MAGIC><LENGTH><BINARY DATA><CRC>

但我不想重新发明轮子。

注意:我正在考虑非常受限的设备:4kb 的 RAM,没有内核,也没有标准的 C 库。

你能想出一个标准的方法来做到这一点(也许是开源库)?

如果您编写自己的解决方案,是否有任何最佳实践?

  • 您是否也在包的末尾使用 MAGIC 字节?
  • 也许使用时间间隔而不是分隔符更好?
  • 如何在流二进制数据中找到包的开头?
  • 也许使用文本协议更好?

更新: 请重新阅读问题。我不应该要求图书馆,而是要求良好的做法。

0 投票
3 回答
1016 浏览

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 宏。

谢谢您的帮助。

0 投票
5 回答
868 浏览

c - 通过函数分配数据 (ANSI C)

我很想知道如何通过函数分配数据,并且在函数返回后数据仍然被分配。这既适用于基本类型(int、char**)也适用于用户定义类型。下面是两个代码片段。两者都在函数内进行分配,尽管在返回之后分配进行。

用户定义类型的行为与以前相同:

有任何想法吗?我想我需要将指针作为参考传递,但我该怎么做?

在此先感谢,防晒霜

0 投票
3 回答
6024 浏览

c - 在启用换行的情况下将终端光标返回到行首

我正在编写一个过滤器(在一个用于终端输出的管道中),有时需要“覆盖”刚刚发生的一行。它的工作原理是逐个字符地将标准输入传递给标准输出,直到\n达到 a,然后调用特殊行为。我的问题是如何返回到行首。

我首先想到的是使用 a\r或 ANSI 序列\033[1G。但是,如果行长到足以在终端上换行(并因此导致它滚动),这些只会将光标移回当前物理行。

我的第二个想法是跟踪行的长度(自上一个以来传递的字符数\n),然后\b多次回显。但是,如果该行包含控制字符或转义序列(可能还有 Unicode?),就会出错。

缺少搜索所有特殊序列并使用它来调整我的字符数,有没有一种简单的方法来实现这一点?

0 投票
3 回答
1221 浏览

c - 将结构指针增加一半的结构大小

我刚刚处理了一个有趣的问题,但我看不出有什么巧妙的方法来解决它。

我有两个表示复杂图形的基本数据结构,声明如下:

实际节点紧跟在标题之后,因此通常使用以下命令创建“graph_t”

并且访问“原始”节点数组

现在,有一个支持函数在减少节点数量的缓冲区上运行。它看起来像这样:

现在,这已经很好地工作了很长时间。上面的任何错误都源于我是凭记忆写的,我只是想解释一下这个想法。

现在让我感到困惑的是,当使用新模块的缩减功能时,输入没有“正确”对齐。当我检查地址时,我注意到以下属性:

当然,这会导致一些问题,因为“偏移”值变得不正确,但这并不那么明显,因为数据结构的所有其他使用都有效(没有“真正的”对齐问题)。

这归结为我的问题 - 当偏移量不能表示为元素的整数时,您是否看到增加指针的一种巧妙方法?

找到一种不诉诸过度施法的方法的奖励积分:)

0 投票
6 回答
8887 浏览

c - 人们使用什么技术/策略在 C(不是 C++)中构建对象?

我对打算在 C 中使用的对象特别感兴趣,而不是构成解释语言(如 python)核心的对象实现。

0 投票
10 回答
199014 浏览

c - 为什么要使用 strncpy 而不是 strcpy?

编辑:我已经添加了示例的源代码。

我遇到了这个例子

产生了这个输出:

这让我想知道为什么有人会想要这种效果。看起来会很混乱。这个程序让我觉得你基本上可以用 Tom Bro763 复制某人的名字(例如 Tom Brokaw)。

使用 strncpy() over strcpy()有什么好处?

0 投票
3 回答
5451 浏览

c - ANSI C 中的无缓冲 I/O

为了教育和编程实践,我想编写一个简单的库,可以处理原始键盘输入,并“实时”输出到终端。

我想尽可能地坚持使用 ansi C,我只是不知道从哪里开始这样的事情。我已经进行了几次谷歌搜索,99% 的结果使用库,或者用于 C++。

我真的很想让它在 Windows 中运行,然后在我有时间的时候将它移植到 OSX。

0 投票
6 回答
14429 浏览

c - 堆栈上的动态内存分配

我最近尝试了这个实验,我没有为未知大小的内存需求进行动态内存分配,而是进行了静态分配。当我声明一个数组a[i]时,我保留i了(数组的大小)变量并依赖于用户提供的输入。

我的问题是:

  • 这样的操作合法吗?
  • 如果不是,为什么编译器不发出任何警告或错误?
  • 该内存将分配到哪里:堆栈还是堆?
  • 为什么 ANSI C/GCC 允许这样做?