Questions tagged «c»

C是用于操作系统,游戏和其他高性能工作的通用计算机编程语言。

1
对于嵌入式系统项目,包含东南亚字符集的绝对最低要求是什么?
我为一家已经开始将嵌入式计算机系统集成到我们生产的产品中的公司工作。我们拥有种类繁多的产品,它们遍布全球。此外,我们还设计了一些集成板,可以根据已刷新到系统的固件来满足多种目的。这样,我们不必为各种产品重新设计计算机硬件-我们要做的就是重写固件层来满足特定产品的需求。 由于这些硬件限制,更改我们的硬件需要采取一些行动,但是编写新软件要简单得多。 我们的产品之一有一个我们以前没有实现过的新要求,那就是需要用户输入文本。 当前,我们已经能够在资源中存储国际文本,并且只有必要的字体字符才被编译为位图图像。这意味着我们已经能够在最小的空间中存储像中文和日语文本这样的高表意语言,因为我们只使用了整个语言集中很小的一部分。 由于此新产品将要求我们的用户输入文本,因此我们将必须实现广泛的字符集。作为主要的PC开发人员,我对ASCII,Unicode,UTF-8等非常熟悉,但是,由于我们板上的FRAM数量有限,因此无法实现所有这些语言的完整字符集存储字体数据。 我的管理层希望能够使用最少的字符集来用于高度表意的语言。我相信日语(平假名?)也有语音字母。汉语,韩语,越南语等语言也有相似的语音字母吗?我很确定该问题的答案是“绝对,不是”,但这是一个值得询问的问题。 管理层提出了“软”要求,即我们只能使用大约8,000个字符的有限字符集来覆盖所有常用的主要语言。如果这不可能,我们需要根据有限的硬件资源寻找某种形式的替代方法来满足我们的需求。 我确信这个问题以前必须已经解决。是否有人需要在这样的约束下工作,同时又需要广泛的字体和字符编码系统的经验?如果是这样,您可以提供哪些智慧?

3
使用C / C ++宏作为条件编译的快捷方式是一种好习惯吗?
假设我要在代码中包含几种类型的输出消息。其中之一是DEBUG,仅当在Debug模式下编译代码时才打印。 通常我必须写一些像 #ifdef DEBUG std::cout << "Debug message" << std::endl; #endif 在许多地方使用起来非常麻烦和烦人。 为代码段定义宏是一种好习惯,这样您就可以使用它吗? MSG_DEBUG("Debug message") 还是有没有其他更优雅的方式在没有宏的情况下如何处理它?我对C和C ++中可能的解决方案感兴趣,因为我在不同的项目中使用了这两种语言。
13 c++  c  macros 

4
是否有关于如何编写现代C的公认准则?
我有很强的Java / Groovy背景,并且已被分配给一个为管理软件维护大量C代码库的团队。 Java Web服务已经外部化了一些痛点,例如处理数据库中的Blob或生成PDF和Excel中的报告。 但是,作为Java开发人员,我对代码的某些方面感到有些困惑: 它很冗长(尤其是在处理“异常”时) 有很多巨大的方法(很多2000行以上的方法) 没有高级数据结构(我很想念List,Set和Map) 无需关注(SQL在代码中充满欢乐) 结果,我觉得企业隐藏在大量的技术代码中,而我的大脑(由面向对象和少量的功能编程所塑造)并不轻松。 该项目的好处是代码简单明了:没有框架,没有运行时的字节码操作,也没有AOP。并且服务器可以通过使用比Java吐出“ hello world”所需的内存更少的内存,在一台计算机上同时回答10000多名用户。 我想学习如何根据公认的现代原理编写C代码。关于如何编写和构造现代C,是否有任何公认的原则? 有点像“有效Java”书的等效内容,但适用于C。 根据答案和评论进行编辑: 我将尝试使我的思维方式适应C代码,而不是尝试将其镜像到OOP。 我已经开始从评论中扫描推荐的编码风格指南(GNU编码标准和Linux内核编码风格)。 然后,我将尝试向我的同事提出这种代码样式。最困难的部分可能是说服同事,将巨大的方法拆分为较小的部分,并且借助一种方法可以避免重复相同的4行错误处理代码。
13 c  maintenance 

4
C结构的行为可以像具有功能一样吗?
我struct在结构可以有成员但没有函数的地方使用C和s。为简单起见,假设我要为我命名的字符串创建一个结构,str并且我希望能够在str.replace(int i, char c)哪里完成i该操作,该操作是字符串的索引,也是c替换位置上的字符的字符i。因为结构体没有功能,或者我们仍然可以通过某种方式实现这种行为并模仿结构体可以具有(简单)功能的事实,这实际上仅仅是结构体将自身复制到新结构体并更新其结构体,所以这将永远不可能吗?字段,它可以做什么? 因此,replace可能是该结构的第三个成员,该成员指向一个新的结构,该新结构在访问或类似的操作时会更新。能做到吗?还是有些内在的东西或某种理论或范例阻止了我的意图? 背景是我正在编写C代码,并且发现自己正在重新发明一些我所知道的函数,这些函数是OOP语言中的内置库,而OOP将是一种处理字符串和命令的好方法。

4
在c中打包结构是否有标准方法或标准替代方法?
当使用CI编程时,发现使用GCCs __attribute__((__packed__))属性打包结构非常有价值,因此我可以轻松地将易失性存储器的结构化块转换为字节数组,以通过总线传输,保存到存储或应用于寄存器块。打包的结构保证了当被当作字节数组对待时,它不会包含任何填充,这既浪费,可能的安全风险,又与接口硬件连接时不兼容。 没有适用于所有C编译器的打包结构的标准吗?如果不是,那么我认为这是系统编程的关键功能是一个异常现象吗?早期使用C语言的用户是否没有发现打包结构的需要,或者是否有其他选择?

6
为什么C数组的长度不能为0?
C11标准说,大小和可变长度的数组“都应具有大于零的值”。不允许长度为0的理由是什么? 特别是对于可变长度的数组,每隔一段时间具有零的大小是很有意义的。当静态数组的大小来自宏或构建配置选项时,它也很有用。 有趣的是,GCC(和clang)提供了允许零长度数组的扩展。Java还允许长度为零的数组。
13 c  array 

4
优化CPU缓存(在C中)时重要的是什么?
阅读这两个问题,我发现了解CPU缓存行为在处理内存中的大量数据时可能很重要。我想了解缓存的工作方式,以便将其他工具添加到优化工具箱中。 关于CPU缓存工作方式的核心点是什么,以便我可以编写明智地使用它的代码?相关地,是否有一种方法可以对代码进行概要分析,以查看缓存使用不当是否会减慢速度?

5
如何改善错误检查和处理能力?
最近,我一直在努力了解什么是正确的检查量以及什么是正确的方法。 我对此有一些疑问: 检查错误(错误的输入,错误的状态等)的正确方法是什么?显式检查错误,还是使用可以从最终代码中优化的断言之类的函数,更好?我感觉像是用很多额外的代码来明确地检查程序是否杂乱,无论如何在大多数情况下都不应该执行这些代码,更不用说大多数错误都以中止/退出失败而告终。为什么将具有显式检查的功能弄乱只是为了中止?我一直在寻找断言而不是显式检查错误,却很少能真正解释什么时候做。 大多数人说“使用断言检查逻辑错误,并使用显式检查检查其他故障”。但这似乎并没有使我们走的太远。我们可以说这是可行的: Malloc returning null, check explictly API user inserting odd input for functions, use asserts 这会使我在错误检查方面变得更好吗?我还可以做些什么?我真的很想改进和编写更好的“专业”代码。
13 c  testing  assertions 

2
为什么glibc与GCC分开维护?
GCC是C编译器。Glibc是C库。但是,对于作为C实现捆绑在一起的编译器和标准库,这不是绝对必要吗? 例如,C库包含ABI和编译器具体的东西等<limits.h>,<stdint.h>等,编译器和API之间而不同。诸如“如何调用主函数”之类的细节也取决于编译器,但实际上,这些细节是由libc.soLinux系统提供的。例如,如果我更改编译器以使其与另一个ABI一起使用,例如使用int8个字节,则C库将不再起作用,因为其中的内容<limits.h>将变得错误。
13 c  gcc 

6
“用C语言编写一个汇编程序。” 为什么要用高级语言编写用于低级语言的机器代码翻译器?
我的微处理器班老师给了我们一个作业,说: “用C语言编写一个汇编程序。” -我亲爱的教授 所以对我来说似乎有点不合逻辑。 如果我没搞错,汇编语言是从机器代码到高级语言之旅的第一步。我的意思是C是比汇编语言更高级的语言。那么,用C编写汇编语言有什么意义呢?在没有C语言的情况下,他们过去在做什么?他们是用机器代码编写汇编程序吗? 对我来说,用高级语言为低级语言编写机器代码翻译器没有任何意义。 假设我们已经创建了一个全新的微处理器架构,该架构甚至没有C编译器。用C编写的汇编程序能否模拟新架构?我的意思是没用吗? 顺便说一下,我知道GNU汇编器和Netwide汇编器是用C编写的。我也想知道为什么它们是用C编写的? 最后,这是我们的教授提供给我们的简单汇编程序的示例源代码: // to compile, gcc assembler.c -o assembler // No error check is provided. // Variable names cannot start with 0-9. // hexadecimals are twos complement. // first address of the code section is zero, data section follows the code section. //fout …

3
负号如何存储?
我正在观看有关带符号整数的最大值和最小值的视频。 以带正号的示例为例-0000 0001第一位表示数字为正,而最后7位表示数字本身。因此,很容易将其解释为+1。 现在以负符号值-1000 0000为例,结果为-8。好的,计算机可以理解这是一个负值,因为它的第一个比特,但是它如何理解000 0000表示-8? 通常,负符号值如何在计算机中存储/解释?

6
C中变量和函数的命名约定
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,以使它成为软件工程堆栈交换的主题。 4年前关闭。 在CI中编写大型项目时遇到了问题。如果我继续编写更多的代码,那么有时候我将很难组织代码。我的意思是,程序不同部分的函数和变量的命名似乎混淆了。 因此,我在考虑是否存在可以用于C变量和函数的有用的命名约定? 大多数语言都建议使用命名约定。但是到目前为止,对于C来说,我唯一读到的是名称应具有描述性,以提高代码的可读性。 编辑: 建议的命名约定的一些示例的示例: Python的PEP 8 Java教程 我在某处阅读了一些其他的Java命名约定,但不记得在哪里。
13 c  naming 

4
C项目避免命名冲突
我正在努力寻找有关中型C库项目的函数命名约定的实用建议。我的库项目分为几个模块和带有各自标题的子模块,并且松散地遵循OO风格(所有函数均以某个结构作为第一个参数,而没有全局变量等)。它奠定了我们这样的东西: MyLib - Foo - foo.h - foo_internal.h - some_foo_action.c - another_foo_action.c - Baz - baz.h - some_baz_action.c - Bar - bar.h - bar_internal.h - some_bar_action.c 一般来说,功能远远太大,(例如)棒some_foo_action,并another_foo_action在一个foo.c实现文件,使大多数功能静态的,收工。 在构建库时,我可以处理去除内部(“模块私有”)符号的问题,以避免用户与其客户端程序发生冲突,但是问题是如何在库中命名符号?到目前为止,我一直在做: struct MyLibFoo; void MyLibFooSomeAction(MyLibFoo *foo, ...); struct MyLibBar; void MyLibBarAnAction(MyLibBar *bar, ...); // Submodule struct MyLibFooBaz; void MyLibFooBazAnotherAction(MyLibFooBaz *baz, ...); 但是,我最终得到了疯狂的长符号名(比示例长得多)。如果我没有在名称前添加“假名称空间”,则模块的内部符号名称会发生​​冲突。 注意:我不在乎骆驼案/帕斯卡案等,只是名字本身。

9
数组还是Malloc?
我在应用程序中使用以下代码,并且工作正常。但是我想知道使用malloc还是将其保留为更好? function (int len) { char result [len] = some chars; send result over network }
13 c 

8
C字符串是否始终以null终止,还是取决于平台?
现在,我正在使用嵌入式系统,并研究在没有操作系统的微处理器上实现字符串的方法。到目前为止,我正在做的只是使用使NULL终止的字符指针并将它们视为NULL表示结尾的字符串的想法。我知道这很普遍,但是您是否总是可以指望这种情况? 我问的原因是我正在考虑也许在某个时候使用实时操作系统,并且我想尽可能多地重用当前代码。因此,对于存在的各种选择,我是否可以期望字符串能够正常工作? 让我更具体地说明我的情况。我正在实现一个通过串行端口接收和处理命令的系统。我能否保持命令处理代码相同,然后期望在RTOS(包含命令)上创建的字符串对象全部以NULL终止?还是根据操作系统而有所不同? 更新资料 在被建议看一下这个问题之后,我确定它不能完全回答我的要求。问题本身是在询问是否应该始终传递字符串的长度,这与我要问的完全不同,尽管某些答案中包含有用的信息,但它们并不是我要找的。那里的答案似乎提供了为什么或为什么不以空字符终止字符串的原因。我要问的是,我是否可以或多或少地期望不同平台的出生字符串以空值终止自己的字符串,而不必走出去尝试在那里的每个平台。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.