Questions tagged «c»

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

2
为什么要对结构使用typedef?
在C语言(ANSI,C99等)中,结构存在于自己的名称空间中。链表的结构可能看起来像这样: struct my_buffer_type { struct my_buffer_type * next; struct my_buffer_type * prev; void * data; }; 然而,对于大多数C程序员来说,自动对这些结构进行如下类型的定义似乎是很自然的: typedef struct tag_buffer_type { struct tag_buffer_type * next; struct tag_buffer_type * prev; void * data; } my_buffer_type; 然后像普通类型一样引用该结构,即get_next_element(my_buffer_type * ptr)。 现在我的问题是:是否有特定原因? 维基百科说http://en.wikipedia.org/wiki/Typedef#Usage_concerns 有些人反对typedef的广泛使用。大多数参数都以typedef仅隐藏变量的实际数据类型为中心。例如,Linux内核黑客和文档编制者Greg Kroah-Hartman阻止将它们用于除函数原型声明以外的任何内容。他认为这种做法不仅不必要地混淆了代码,而且还可能导致程序员意外地滥用大型结构,认为它们是简单的类型。[4] 其他人则认为,使用typedef可以使代码更易于维护。K&R指出使用typedef有两个原因。首先,它提供了使程序更具可移植性的方法。不必更改在程序源文件中出现的所有类型的类型,只需更改单个typedef语句即可。其次,typedef可以使复杂的声明更易于理解。 我个人想知道,使用单独的struct命名空间是否有时没有使用类型定义的结构没有足够的好处,并且由于周围存在着几种C编程文化(我的经验是Windows C编程与Linux C编程有着不同的传统),如果还有其他我不了解的传统。 然后,我对历史考量(C的前身,第一个版本)感兴趣。

2
为什么错误代码无效?
我经常在C代码中看到返回的错误代码,例如return -EINVAL而不是return EINVAL。为什么要使用否定?
12 c 

3
OO C公共和私有功能的典型命名约定是什么?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 简短问题 有一种典型的方式来命名OO C项目的“公共”和“私人”成员吗? 背景 我完全理解公共和私营成员没有真正在C语言中存在。但是,像大多数C程序员一样,我仍然将成员视为公共或私有成员,以维护OO设计。除了典型的面向对象的方法,我发现我的自我下面,让我更容易分辨哪些方法的模式(见下面的例子),意味着对外界VS私有成员可能有更少的检查/更有效等...是否存在针对此类问题的标准或最佳实践,或者下面的示例是解决此问题的好方法? 标题示例 #ifndef _MODULE_X_H_ #define _MODULE_X_H_ bool MOD_X_get_variable_x(void); void MOD_X_set_variable_x(bool); #endif /* _MODULE_X_H_ */ 范例来源 // Module Identifier: MOD_X #include "module_x.h" // Private prototypes static void mod_x_do_something_cool(void); static void mod_x_do_something_else_cool(void); // Private Variables static bool var_x; // Public Functions - Note the upper …

2
将单元测试添加到旧的普通C项目中
标题说明了一切。我公司正在将微控制器设备的旧固件项目重复使用,完全用纯C语言编写。 有些部分显然是错误的,需要更改,并且这些部分来自C#/ TDD背景,我不喜欢无测试地随机重构内容以确保功能保持不变的想法。此外,我已经看到,在很多情况下,通过微小的更改就引入了难以发现的错误(如果使用回归测试,我相信这是可以解决的)。为避免这些错误,需要格外小心:很难在代码周围跟踪大量的全局变量。 总结一下: 在重构之前,如何在现有的紧密耦合代码中添加单元测试? 您推荐什么工具?(重要性不高,但仍然很高兴知道) 我没有直接参与编写此代码(我的责任是一个可以通过多种方式与设备交互的应用程序),但是如果有可能使用它们时,如果抛弃了良好的编程原则,那将是很糟糕的。

7
C程序员应该知道什么?[关闭]
按照目前的情况,这个问题并不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 6年前关闭。 每个体面的C程序员都应该了解/知道的一些概念/技术/语言功能(不包括通用软件工程和类似软件,仅专注于C特定的东西)。我想知道,以便我能够填补我的C知识中的某些空白。

7
从C中学到了哪些高级语言无法学习的原理?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 3年前关闭。 我相信C是学习编程背后原理的好语言。对于那些与高级语言(如Ruby)“相去甚远”的低级语言,您打算学什么?
11 c  low-level 

5
比较三个数字的简单方法
我有一些代码,其中包含一系列if可以正常工作的,但是感觉很混乱。基本上,我想选择三个整数中最大的一个,并设置一个状态标志来说明选择了哪个。我当前的代码如下所示: a = countAs(); b = countBs(); c = countCs(); if (a > b && a > c) status = MOSTLY_A; else if (b > a && b > c) status = MOSTLY_B; else if (c > a && c > b) status = MOSTLY_C; else status = DONT_KNOW; 这种模式会发生几次,并且变量名较长,从视觉上确认每一个if都是正确的会有些困难。我觉得可能会有更好,更清晰的方法来执行此操作;有人可以建议什么吗? …
11 algorithms  c 

2
RTOS与Bare Metal在MCU编程方面的优势?
请注意:这个问题专门提到了两个RTOS,但更为通用,以前曾为嵌入式RTOS编写过C代码并且直接在MCU上运行其软件的任何人都可以回答。 我有兴趣了解有关嵌入式RTOS的更多信息并为其编写应用程序。我目前正在查看Embox和RIOT,因为它们是开源的,现代的,活跃的并且似乎有出色的文档。我的目标分为两个阶段:第一阶段是弄清楚如何将这些OS编译并刷新到MCU(可能是AVR或ARM)。然后,第2阶段将编写一个简单的C程序(基本上是一个无头的守护程序),该程序会随着时间的流逝而发展为“业余应用程序”。然后,我将该程序刷新/部署到同一MCU,从而成功部署了一个由Embox / RIOT和位于其之上的应用程序组成的应用程序堆栈。 在走上任何最终导致死胡同的道路之前,我偶然发现了这篇文章,很好地解释了为什么用C /汇编器编写并闪存到MCU的实时应用程序真正不需要它们下面的RTOS。 。 所以现在我真的很困惑,并且质疑我对计算理论的一些基本理解。我想我想首先决定是否使用Embox / RIOT,或者: 保持进度,并在两个OS +应用程序的MCU上使用“应用程序堆栈”;要么 请留意本文的警告,并选择运行我的应用程序“裸机”的MCU 显然,前者需要做更多的工作,因此最好还是有一个很好的理由/选择那条路线。因此,我想问:这些(和类似的)嵌入式RTOS为MCU / C应用程序开发人员提供的真正好处是什么?使用RTOS,我的C应用程序可以从哪些特定功能中受益(也许不重新发明轮子?)?抛弃RTOS并裸机失去了什么? 我在这里要求具体的例子,而不是当您进入RTOS的Wikipedia条目时获得的媒体宣传;-)

5
C静态库不受欢迎吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 共享库有两个参数: 它有助于减少磁盘空间。 共享库更新后,取决于它的所有二进制文件都会更新。 共享库主要有一个缺点: 他们可以引入依赖地狱。 在台式计算机上,第一个优点实际上不再成立。如今,浪费磁盘空间已不是什么大问题。 拥有静态二进制文件将使我们能够获得更好的程序包管理器-我的意思是,依赖关系已经成为过去。添加程序就是添加二进制文件。最后是一个文件夹,让它处理其文件。删除程序就是删除该文件。依赖关系?走了 第二个优势仍然存在,但我认为台式机上静态二进制文件的优势胜过它。我的意思是,尽管具有共享库的优势,但即使是Go这样的新语言也可以编译所有二进制文件,这是因为它具有便利性。 既然共享库的主要优点之一不再重要,那么C静态库是否仍然不受欢迎?如果是这样,为什么?
11 c  compiler 

4
指针索引
我目前正在阅读一本书,标题为“ C的数字食谱”。在本书中,作者详细介绍了如果我们的索引以1开头(我不完全遵循他的论点,而这不是本文的重点),某些算法在本质上会更好地工作,但是C总是以0开头的数组索引为了解决这个问题,他建议在分配后简单地减小指针,例如: float *a = malloc(size); a--; 他说,这将有效地为您提供一个索引,该索引的索引从1开始,然后将被释放: free(a + 1); 据我所知,这是C标准未定义的行为。在HPC社区中,这显然是一本享有盛誉的书,所以我不想简单地无视他在说什么,但是对我而言,仅将指针减少到所分配的范围之外似乎是很粗略的。这是C中的“允许”行为吗?我已经使用gcc和icc对其进行了测试,这两个结果似乎都表明我没有担心什么,但我想绝对肯定。
11 c  pointers 

2
用不同的编译器创建的(C)目标文件是否与二进制兼容?
我了解C ++编译器彼此不兼容。但是,我无法在C上找到关于此主题的任何东西。我知道C标准为编译器提供了很多空间,使它们能够执行合适的事情,例如,他们认为合适:例如,大多数(所有?)数据类型的大小和对齐方式是实现定义的,除了一些最小的保证。因此,两个编译器(或同一编译器的两个版本)可能在许多细节上存在分歧。 我是否认为不能保证使用不同编译器编译的两个目标文件实际上可以正确链接是正确的吗?例如,一个目标文件中指针的大小可以是32位,而在另一个目标文件中则可以是64位。但是如果是这样,为什么C库有时会以预编译形式分发?是否期望我将使用与他们相同的编译器(例如gcc),或者使用某些事实上的标准来确保二进制兼容性?带有外语接口的其他语言如何确保在与C对象文件链接时事物能够正确对齐?
11 c  compiler 

1
以char类型存储EOF(文件结尾)字符
我读过丹尼斯·里奇(Dennis Ritchie)的《 C编程语言》一书,该书int必须用于容纳EOF的变量-使其足够大以使其可以容纳EOF值-不能char。但是以下代码可以正常工作: #include<stdio.h> main() { char c; c=getchar(); while(c!=EOF) { putchar(c); c=getchar(); } } 没有更多输入时,getchar返回EOF。在上面的程序中,c具有char类型的变量能够成功保存它。 为什么这样做?根据上述书籍中的解释,该代码不起作用。
11 c 

1
在C中编程PID循环
我是一名电气工程师,对数字世界充满了兴趣,并且在我学习的过程中不断学习。我正在对TI处理器进行编程以执行PID(比例-积分-微分)循环,如下图所示: 我还将描述它: 负反馈运算放大器,非反相端子接地。通过负极端子输入。反馈回路是一个与电阻并联的RE串联电路,所有与电容并联的串联电路。 有人知道如何将此电路转换为C代码吗?我对此不满意,可以使用帮助。
11 c 

3
低延迟Unix / Linux
大多数低延迟/高频编程作业(基于作业规范)似乎是在unix平台上实现的。在许多规范中,他们特别要求具有“低延迟linux”类型经验的人员。 假设这并不意味着可以使用实时linux操作系统,人们是否可以在这方面提供帮助?我知道您可以设置线程的CPU亲和力,但我假设他们对此的要求远远超过此。 内核调优?(尽管我听说像solarflare这样的制造商还是会生产内核旁路网卡)? DMA或进程之间可能共享的内存呢?如果人们可以给我简短的想法,我可以去Google上进行研究。 (此问题可能需要熟悉高频交易的人员)
11 c++  c  performance  linux  latency 

3
为什么scanf称为scanf?(与printf相同。)
我很好奇,为什么在C编程语言中读取格式化输入的函数称为“ scanf”而不是“ readf”。我假设它是从较早的语言派生的,那么在那种情况下为什么要用较早的语言命名呢?(递归) 另外,为什么选择“ printf”而不是“ writef”?在非C语言中,为什么要“打印”或“写”而不是“显示”?

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.