Questions tagged «c»

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

16
您今天是否将C用于软件项目?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 如果是,您将在何处以及为何使用它? 如果否,请说明为什么您不接受C。

6
我应该教我的学生阿洛卡吗?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 alloca在现实世界中使用得如何?在合理的时候我应该教我的学生使用alloca吗?还是我应该教他们不要使用它?来自C ++ RAII背景,不必free手动调用的想法听起来很有希望,尤其是在具有多个出口点的函数中。
18 c  teaching 

6
我是否为了较长的“列”代码而牺牲了较短的变量名?
我是CS课的业余程序员,试图学习适当的编程技能。这就是我的代码的样子,它的边缘扩展到103列。 int extractMessage(char keyWord[25], char cipherText[17424], int rowSize, char message[388]) { int keyColumn = 0; int cipherColumn = 0; int offset = 1; int nextWord = 1; int lengthOfWord = 0; int lengthOfCipher = 0; lengthOfWord = length(keyWord); lengthOfCipher = length(cipherText); while (keyWord[keyColumn] != cipherText[cipherColumn]) { cipherColumn++; if (keyWord[keyColumn + …
17 c  coding-style 

2
在连接相邻的字符串文字时
C和C ++将相邻的字符串文字编译为单个字符串文字。例如: "Some text..." "and more text" 等效于: "Some text...and more text" 在其他C系列语言(如C#或Java)中,这是一种语法错误(顺便说一句很好)。 C和C ++这样做的理由/历史原因是什么?

4
是否有必要遵循该标准,并采用C标准?
Stack Overflow上有一些非常有经验的人,他们总是谈论C标准。人们似乎不喜欢非便携式解决方案,即使他们为我工作。好的,我知道需要遵循该标准,但是它不会给程序员的创造力带来束缚吗? 遵循标准有什么具体好处?特别是因为编译器可能会稍微不同地实现标准。

7
如何避免静态分析的陷阱
我在一家在Joel Test(至少在纸上)上获得11分的公司工作。 但是实际上,没有什么能比预期的要好,该项目已经在DEFCON 1上进行了半年。现在,我的大多数同僚都高兴,如果他们可以在周日下午6:00回家。 使用静态分析工具是使我不工作的显而易见的好习惯之一。该项目都跟踪gcc -Wall警告和专有且非常昂贵的“ C / C ++”工具。 Gcc警告的确经常指向真实的(如果大部分时间都是无礼的)错误。 但是,专用工具列出了诸如隐式强制转换和字符串文字的sizeof之类的内容。隐式演员表也在其样式表中列入黑名单。 标准做法是迫使人们关闭每个警告。请注意,这确实排除了主要是误报的警告,这不是问题。 结果是: 人们向每个右值和每个参数添加类型转换,以隐藏过程中真正存在问题的类型不匹配。 人们引入一个错误,或者使用其他有问题的语言功能(用strlen代替sizeof,用strncpy代替strcpy,等等)。 警告被静默。 错误报告开始滚动。 主要要点是原始代码是由在语言能力范围内安全地工作的人编写的,而修正不是。 现在,我真的不认为可以挽救这家公司。但是,我想知道是否有一种更好的方法,最好是可以使用“专业”工具的方法,还是我应该避免完全使用它们,以防将来我自己做出决定。 不能假定所有程序员都是不能犯错的天才的解决方案。因为如果可以的话,那么首先就不需要使用这些工具。

8
如何在嵌入式设备上进行TDD?
我对编程并不陌生,甚至在AVR上使用过一些低级C和ASM,但我确实无法涉足更大规模的嵌入式C项目。 由于Ruby的TDD / BDD理念退化,我无法理解人们是如何编写和测试这样的代码的。我并不是说这是一个不好的代码,我只是不明白这是如何工作的。 我想更多地参与一些底层编程,但是我真的不知道该如何处理,因为它看起来就像是我习惯的完全不同的思维方式。我在理解指针算术或分配内存的方式方面没有问题,但是当我看到与Ruby相比C / C ++代码看起来多么复杂时,这似乎很难。 由于我已经为自己订购了Arduino开发板,所以我很想深入了解一些低级C并真正了解如何正确地做事,但是似乎高级语言的规则都不适用。 甚至有可能在嵌入式设备上或在开发驱动程序或自定义引导加载程序之类的东西时进行TDD吗?

6
Fortran编译器是否真的比C编译器生成更快的代码?
当我在大学学习时,我经常听到这样的想法:对于同等程序,Fortran编译器生成的代码比C编译器更快。 关键原因是这样的:Fortran编译器每行代码平均发出1,1个处理器指令,而C编译器每行代码平均发出1,6处理器指令 -我不记得确切的数字了,但是想法是C编译器发出明显更多的机器代码,因此产生较慢的程序。 这样的比较有效吗?我们可以说Fortran编译器比C编译器生成更快的程序,反之亦然,为什么存在这种差异?

2
为什么Linux / BSD中没有通用批处理系统调用?
背景: 系统调用开销比函数调用开销大​​得多(估计范围为20-100x),这主要是由于上下文从用户空间切换到内核空间再返回。内联函数通常可以节省函数调用开销,并且函数调用比syscall便宜得多。可以说,开发人员希望通过尽可能多地在一个系统调用中进行内核内操作来避免一些系统调用开销。 问题: 这已经创造了很多(多余的?)系统调用像sendmmsg() ,的recvmmsg()还有CHDIR,开放,lseek的和/或类似的符号链接组合:openat,mkdirat,mknodat,fchownat,futimesat,newfstatat,unlinkat,fchdir,ftruncate,fchmod,renameat,linkat,symlinkat,readlinkat,fchmodat,faccessat,lsetxattr,fsetxattr,execveat,lgetxattr,llistxattr,lremovexattr,fremovexattr,flistxattr,fgetxattr,pread,pwrite等... 现在,Linux已添加copy_file_range(),显然将读取lseek和写入syscall组合在一起。变成fcopy_file_range(),lcopy_file_range(),copy_file_rangeat(),fcopy_file_rangeat()和lcopy_file_rangeat()只是时间问题...但是由于涉及2个文件而不是另外X个调用,因此它可能变成X ^ 2更多。好的,Linus和各种BSD开发人员不会放任不管,但我的观点是,如果有一个批处理syscall,那么所有这些(大部分?)都可以在用户空间中实现,并且可以减少内核复杂性而无需增加太多如果libc方面有任何开销。 已经提出了许多复杂的解决方案,其中包括某种形式的特殊syscall线程,用于非阻塞syscall到批处理syscall。但是,这些方法以与libxcb和libX11几乎相同的方式为内核和用户空间增加了相当大的复杂性(异步调用需要更多的设置) 解?: 通用批处理系统调用。这将减轻最大的成本(多模式切换),而不会具有与专用内核线程相关的复杂性(尽管以后可以添加功能)。 socketcall()系统调用中的原型基本上已经有了良好的基础。只需将其从采用参数数组扩展为采用返回数组,指向参数数组的指针(包括系统调用号),系统调用数和标志参数即可,如下所示: batch(void *returns, void *args, long ncalls, long flags); 一个主要的区别是,为了简单起见,参数可能全部都需要用作指针,以便先前的syscall的结果可以被后续的syscall使用(例如open(),read()/中使用的文件描述符write()) 一些可能的优点: 更少的用户空间->内核空间->用户空间切换 可能的编译器开关-fcombine-syscalls尝试自动进行批处理 异步操作的可选标志(返回fd立即观看) 在用户空间中实现将来的组合syscall功能的能力 题: 实现批处理系统调用是否可行? 我是否缺少一些明显的陷阱? 我是否高估了收益? 对我来说,麻烦实施批处理系统调用是否值得(我不在Intel,Google或Redhat工作)? 我之前已经修补了自己的内核,但不愿处理LKML。 历史表明,即使某些东西对“普通”用户(没有git写访问权限的非公司最终用户)广泛有用,它也可能永远不会在上游被接受(unionfs,aufs,cryptodev,tuxonice等)。 参考文献: FlexSC:具有少异常系统调用的灵活系统调用调度 通过专用用户和内核CPU避免系统调用开销

2
将带有指针参数的C ++方法转换为C函数是否可以接受?
我在ESP-32上使用C ++。注册计时器时,我必须这样做: timer_args.callback = reinterpret_cast<esp_timer_cb_t>(&SoundMixer::soundCallback); timer_args.arg = this; 计时器在这里 soundCallback。 注册任务时也是如此: xTaskCreate(reinterpret_cast<TaskFunction_t>(&SoundProviderTask::taskProviderCode), "SProvTask", stackSize, this, 10, &taskHandle); 因此,该方法在单独的任务中启动。 GCC总是警告我这些转换,但它按计划进行。 生产代码中可以接受吗?有一个更好的方法吗?
16 c++  c  functions 

4
我们如何从汇编到机器代码(代码生成)
有没有一种简单的方法可以可视化将代码组装到机器代码之间的步骤? 例如,如果您在记事本中打开有关二进制文件的文件,则会看到机器代码的文本格式表示形式。我假设您看到的每个字节(符号)都是对应的ascii字符,因为它是二进制值? 但是我们如何从汇编程序转换为二进制程序,幕后发生了什么?

6
在C语言中,代码复制是否必不可少?
我是C的新手,我想知道在编写通用数据结构和C时,代码重复是否必不可少? hash map例如,我可以尝试编写一个通用实现,但是我总是发现最终结果很混乱。我还可以针对此特定用例编写专门的实现,使代码清晰易读,易于调试。后者当然会导致某些代码重复。 通用实现是规范,还是针对每个用例编写不同的实现?

10
在算法编程方面,Python优于C
我一直在研究一些算法,并一直在研究SPOJ.pl TopCoder等网站。我发现程序员通常在大多数算法编程竞赛中都喜欢C或C ++。 现在,我最近遇到了一些麻烦。我对C和Python都了解一些,并且在尝试编写代码时,对于大多数算法,我似乎更喜欢Python而不是C。每当我坐下来写CI的代码时,大约15分钟后就放弃了,因为我觉得它太麻烦了并且倾向于使用python。传递矩阵指针等似乎浪费了我实际上可以用来思考算法本身的时间。 现在,我知道并且听到很多人说C是一种非常重要的语言,并且是许多程序员的后援。 我想知道的是,我的这种方法是否有任何缺点/后果/缺点等。 这不是Python与C的争论。从长远来看,这个关于易用性而不是C首选python的特定实践将如何影响我或任何其他程序员/计算机科学家的问题。 我很乐意听到在行业中使用过这些语言的人,以及/或者开发大型软件/库等的人。

2
对现代C ++范例的最佳概述?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为软件工程堆栈交换的主题。 4年前关闭。 我曾经在8到10年前广泛地编写C ++。从那以后,出于专业原因,我开始使用C#。但是,我有时会看到类似 “如果您仍在手动跟踪指针引用,那么您做错了” 要么 “只要您使用的是RAII之类的现代概念,并且不像正在恢复的C开发人员那样手动分配内存,C ++绝对是安全的。” 两者都是十年前的标准程序。我已经看到,最近C ++有了很大的改进。特别是C ++ 0x似乎具有一些新功能。对于“ C / old C ++”程序员来说,赶上“现代” C ++模式和实践的最佳资源是什么?

8
使用C ++但不使用语言的特定功能时,应该切换到C吗?
在业余时间,我正在开发NES模拟器作为一种爱好。我之所以使用C ++,是因为它是我最常使用,最常了解和最喜欢的语言。 但是,既然我在项目中取得了一些进步,我意识到我几乎没有使用C ++的任何特定功能,并且可以在普通C语言中完成并获得相同的结果。我不使用模板,运算符重载,多态性,继承。那你会说什么 我应该留在C ++还是用C重写? 我不会这样做来获得性能,它可能会产生副作用,但是想法是为什么在不需要C ++时为什么要使用C ++? 我正在使用的C ++的唯一功能是用于封装数据和方法的类,但是可以使用结构和函数来完成,我正在使用new和delete,但也可以使用malloc和free,我仅将继承用于回调,这可以通过指向函数的指针来实现。 请记住,这是一个业余项目,我没有截止日期,因此需要重写的开销时间和工作不是问题,也可能很有趣。那么,问题是C还是C ++?
16 c++  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.