Questions tagged «c»

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


8
在头文件或源文件中记录函数是否更好?
在区分“源”文件和“头文件”(主要是C和C ++)的语言中,最好在头文件中记录函数: (从CCAN窃取) /** * time_now - return the current time * * Example: * printf("Now is %lu seconds since epoch\n", (long)time_now().tv_sec); */ struct timeval time_now(void); 或在源文件中? (从PostgreSQL窃取) /* * Convert a UTF-8 character to a Unicode code point. * This is a one-character version of pg_utf2wchar_with_len. * * No …
86 c++  c  headers 

19
为什么OCaml不受欢迎?
我一直听说C是嵌入式系统或任何需要以最高速度运行的语言的首选语言。我从来没有对C产生过浓厚的兴趣,主要是因为我不喜欢指针算术,并且该语言仅比汇编程序强。 另一方面,ML语言是功能强大的垃圾收集语言,OCaml甚至具有对象模型,但它们以与C一样快而享有盛誉。ML语言具有任何人都可以要求编写的抽象,简洁的语言代码,但它保留了编写高性能应用程序所需的速度。 特别是,OCaml可以在传统上使用C的任何地方使用,例如用于嵌入式设备,图形驱动程序,操作系统等。按权利,OCaml到现在应该已经占领了整个世界,但是几乎没有人听说过这种语言用过的。 这是一个主观的问题,但是为什么OCaml和ML其他语言仍然如此晦涩,而C和其他语言却变得流行呢?
86 c  ocaml 

8
为什么使用尾随换行符而不使用printf开头?
我听说您在使用时应避免使用换行符printf。因此,而不是printf("\nHello World!")你应该使用printf("Hello World!\n") 在上面的特定示例中,这没有意义,因为输出将有所不同,但请考虑以下事项: printf("Initializing"); init(); printf("\nProcessing"); process_data(); printf("\nExiting"); 相比: printf("Initializing\n"); init(); printf("Processing\n"); process_data(); printf("Exiting"); 我觉得尾随换行符没有任何好处,除了看起来更好。还有其他原因吗? 编辑: 我现在就在这里进行点票表决。我不认为这属于堆栈溢出,因为这个问题主要与设计有关。我也要说,尽管对此事可能有意见,但Kilian Foth的回答和cmaster的回答证明了一种方法的确确实有非常客观的好处。
79 c 

5
为什么没有针对C和C ++的程序包管理系统?[关闭]
软件包管理系统存在一些编程语言: TeX的CTAN Perl的CPAN Python的点子和鸡蛋 Java Maven 阴谋的哈斯克尔 红宝石宝石 NPM对的NodeJS 前端Javascript和CSS的Bower nuget for C# PHP 作曲家 这样的系统还有其他语言吗?C和C ++呢?(这是主要问题!)为什么没有适用于他们的系统?而不是创建包yum,apt-get或其他一般的包管理系统更好?
78 c++  c  builds  packages 

20
可以用可读代码替换优化代码吗?
有时,您会遇到必须扩展/改进某些现有代码的情况。您会看到旧代码非常精简,但是它也很难扩展,而且花时间阅读。 用现代代码代替它是一个好主意吗? 一段时间以前,我喜欢精益方法,但现在看来,最好牺牲很多优化,而采用更高的抽象,更好的接口和更易读,可扩展的代码。 编译器似乎也越来越好,因此诸如之类struct abc = {}的东西被悄无声息地变成了memsets,shared_ptrs产生的代码几乎与原始指针扭曲相同,模板工作得很好,因为它们产生了超精简代码,依此类推。 但是,有时您仍然会看到基于堆栈的数组和带有一些晦涩逻辑的旧C函数,通常它们不在关键路径上。 如果您必须以某种方式触摸其中的一小部分代码,那么更改这种代码是一个好主意吗?

10
为什么C数组不跟踪其长度?
不使用数组in显式存储数组长度的背后原因是什么C? 从我的角度来看,这样做的原因很多,但并没有太多支持标准(C89)的理由。例如: 在缓冲区中具有可用长度可以防止缓冲区溢出。 Java风格arr.length既清晰又避免了程序员int在处理多个数组时必须在堆栈上维护多个s的情况。 功能参数变得更有说服力。 但我认为,最有动力的原因是通常情况下,不保留长度就不会节省空间。我敢说,数组的大多数使用都涉及动态分配。没错,在某些情况下,人们会使用在堆栈上分配的数组,但这只是一个函数调用*-堆栈可以额外处理4或8个字节。 由于堆管理器无论如何都必须跟踪动态分配的阵列所用的空闲块大小,所以为什么不使该信息可用(并添加在编译时检查的附加规则,除非有人愿意,否则不能显式地操纵长度)喜欢在脚上开枪)。 我能想到的对对方的唯一的事情是没有长度跟踪可能已经做出简单的编译器,但不是说要简单得多。 *从技术上讲,可以用自动存储的数组编写某种递归函数,在这种(非常复杂的)情况下,存储长度确实可以有效地占用更多空间。
77 c 

12
面向对象编程比过程编程有什么好处?
我试图了解过程语言(例如C)和面向对象的语言(例如C ++)之间的区别。我从未使用过C ++,但我一直在和朋友们讨论如何区分两者。 有人告诉我C ++具有面向对象的概念以及定义变量的公共模式和私有模式:C语言没有。在Visual Basic.NET中开发程序时,我从来不需要使用它们:这些有什么好处? 我还被告知,如果变量是公共变量,则可以在任何地方访问它,但是尚不清楚它与C之类的语言中的全局变量有何不同。还不清楚私有变量与局部变量有何不同。 我听到的另一件事是,出于安全原因,如果需要访问某个函数,则应首先继承该函数。用例是管理员应该只拥有所需的权限,而不是所有的权限,但是似乎有条件的也可以工作: if ( login == "admin") { // invoke the function } 为什么这不理想? 鉴于似乎有一种方法性的方法可以完成所有面向对象的编程,所以我为什么要关心面向对象的编程?

14
执行C程序时,是否将诸如“ int”和“ char”之类的数据类型声明符存储在RAM中?
当C程序运行时,数据存储在堆或堆栈中。这些值存储在RAM地址中。但是类型指示器(例如int或char)呢?他们也存储吗? 考虑以下代码: char a = 'A'; int x = 4; 我读到A和4存储在这里的RAM地址中。但是,我们a并x?最令人困惑的是,执行如何知道a是char和xint?我的意思是,int并且char在RAM中提到了? 假设某个值存储在RAM的某个位置,为10011001;如果我是执行代码的程序,我怎么知道此10011001是a char还是an int? 我不明白的是,当计算机从诸如10001之类的地址中读取变量的值时,无论它是an int还是,计算机如何知道char。想象一下,我单击了一个名为的程序anyprog.exe。代码立即开始执行。该可执行文件是否包含有关存储的变量是类型int还是变量的信息char?
74 c  data 

5
为什么C编译器这么少?
C是世界上使用最广泛的语言之一。它占现有代码的很大一部分,并继续用于大量的新代码。它受到用户的喜爱,它的广泛移植使能够运行C对许多平台的非正式定义而言,并因其是一种具有相对简洁功能的“小型”语言而受到其粉丝的称赞。 那么所有的编译器在哪里? 在桌面上,(实际上)有两个:GCC和Clang。考虑了几秒钟,您可能会记得英特尔也存在。还有很多其他的东西,对于普通人来说实在太晦涩难懂了,几乎没有普遍地去支持最新的语言版本(甚至常常是定义明确的语言子集,只是“子集”)。此列表的一半成员是历史脚注;其余大多数都是非常专业的,实际上还没有实现完整的语言。实际上很少有开源的。 Scheme和Forth-其他深受其迷们喜爱的小语言-可能比实际用户拥有更多的编译器。甚至像SML之类的东西,也要比C有更多“严肃”的实现方式可供选择。而针对验证的新的(未完成的)C编译器的发布实际上看到了一些相当负面的回应,而资深的实现则努力争取足够的贡献者甚至赶上C99。 为什么?实现C这么难吗?不是C ++。用户是否只是对其所属的复杂度组有一个非常歪斜的想法(即实际上它比Scheme更接近C ++)?

5
头文件中应该包含什么,不应该包含什么?[关闭]
头文件绝对不应包含哪些内容? 例如,如果我正在使用具有许多常量的已记录的行业标准格式,那么在头文件中定义它们(如果我正在为该格式编写解析器)是否是一种好习惯? 头文件应包含哪些功能? 什么功能不应该?
71 c  headers 

19
我为什么要关心微观性能和效率?
C / C ++页面上的许多问题和答案,特别是或间接地讨论了微性能问题(例如,间接函数,直接函数与内联函数的开销),或者使用O(N 2)vs O(N log N)算法100个项目列表。 除非或直到我知道我有问题,否则我始终不关心微性能,也不关心宏性能,而是专注于易于维护的可靠代码。 我的问题是,为什么很多程序员这么在乎呢?对于大多数开发人员来说,这真的是一个问题吗?我是否只是幸运地不必为此担心太多,还是我是一个糟糕的程序员?

10
当与“ if”和“ while”一起使用时,为什么语言需要在表达式周围加上括号?
如C,Java中,和C ++语言在使用时都需要围绕整个表达式括号if,while或switch。 if (true) { // Do something } 相对于 if true { // Do something } 我觉得这很奇怪,因为括号是多余的。在此示例中,true是一个单独的表达式。括号不会以我所知的任何方式改变其含义。为什么存在这种奇怪的语法?为什么如此常见?我不知道有什么好处吗?

10
为什么C胜过Pascal?[关闭]
我的理解是,在1980年代,也许也是在1990年代,Pascal和C在生产语言上几乎是一对一的。 帕斯卡的最终灭亡是仅由于Borland忽视了Delphi吗?还是还有更多的东西,例如运气不好或Pascal固有的错误(希望它复兴)。 我对可以支持的历史事实和观察感兴趣,而不是喜欢和不喜欢。

11
如何使老板相信ANSI C不适合我们的新项目?[关闭]
几个月前,我们开始开发一个应用程序,以控制内部开发的测试设备并记录一组测量值。它应该具有简单的UI,并且由于必须进行连续记录,因此可能需要线程。该应用程序将使用几年,并且在此期间应由许多计算机科学专业的学生维护。 我们的老板大约30年前毕业(不要被视为冒犯;我也有一半以上的时间都在我的背上),并责令我们在ANSI C中开发此应用程序。理由是他是唯一的一位将一直存在,因此他必须能够了解我们在做什么。他还裁定我们不应使用抽象数据类型。他甚至给我们列出了他希望我们使用的全局变量的名称(叹气)。 我实际上尝试了这种方法一段时间,但确实让我放慢了脚步,以确保所有指针操作都是安全的并且所有字符串的大小均正确。此外,与手头问题实际相关的代码行数仅占我们代码库的一小部分。几天后,我放弃了整个工作,并使用C#重新开始。我们的老板已经看到了程序的运行,他喜欢它的工作方式,但是他不知道该程序是用另一种语言编写的。 下周,我们两个人将开会讨论源代码,以便他“知道如何维护它”。我有点害怕,我想听听你们可以用哪些论点支持我的决定。 ward弱的你

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.