Questions tagged «c»

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

3
带有度数参数的trig函数何时应返回-0.0?
在创建三角函数my_sind(d),my_cosd(d),my_tand(d),即使用了度参数,而不是一个弧度一个以90的倍数提供确切的答案,我注意到,结果是有时-0.0不是0.0。 my_sind( 0.0) --> 0.0 my_sind(-0.0) --> -0.0 my_sind(180.0) --> -0.0 my_sind(360.0) --> 0.0 sin()并且tan()通常会针对给定的零符号输入返回相同的零符号结果。my_sin()应该sin()为这些输入匹配才有意义。 my_sind( 0.0) alike sin( 0.0) --> 0.0 my_sind(-0.0) alike sin(-0.0) --> -0.0 现在的问题是:什么整数non_zero_n应/可将结果再回到-0.0为my_sind(180*non_zero_n),my_cosd(180*n + 180),my_tand(180*non_zero_n)? 编写代码很容易,因此只需f(-0.0)生成-0.0并完成即可。简单地想知道是否有任何理由使任何其他 f(x)回报-0.0(非零),x以及确保该符号的重要性。 注:这是不是为什么的问题0.0与-0.0发生。这不是为什么cos(machine_pi/4)不回来0.0。这也不是如何控制0.0或的生成的问题-0.0。我将其视为设计问题是最好的。
10 c  math 

3
Clang / LLVM准备好迎接黄金时间了吗?[关闭]
按照目前的情况,这个问题并不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 6年前关闭。 可以使用Clang代替gcc吗?您对此有何经验?还有哪些不利条件? 编译的性能比gcc好得多,但是关于执行它时生成的代码的性能呢? 有没有好的工具可以在Linux或Windows上运行作为前端(IDE)? 编辑:我的意思是C编译器。C ++还不是很好。

3
在文件的开头写一些您仅在结尾知道的内容
背景:我正在编写微控制器C代码来编写EBML文件。EBML就像是带有嵌套元素的二进制XML,但是不是开始和结束标签,而是一个开始ID,长度和数据。我将其写入低功耗应用程序的外部Flash中,因此我希望将Flash的访问量降至最低。内存也很有限,因为没有一件事情容易。 当我可以将整个EBML元素保留在内存中时,生成它很容易,因为在知道长度之后,我可以返回并填写每个元素的长度。问题是当我无法将整个元素保存在内存中时该怎么办。我看到的选项是: 写出我所知道的内容,然后返回并添加长度(最简单,但是添加的闪存访问量比我想要的更多) 在开始编写每个元素之前,先计算它们的长度(相对容易,但是需要很多处理器时间) 一旦我的内存填满,就切换模式,这样我就可以继续浏览数据,但是仅是为了计算已经在内存中保留的元素的长度。然后写出内存中的内容,然后返回并继续从上次中断的地方处理数据。(到目前为止,我最喜欢的选项) 在需要编写元素且最终长度未知时,为它们提供最大或最坏情况的长度。(比上面更容易,但可能适得其反并浪费空间) 问题:看来这应该是人们思考过的相对普遍的问题。我知道在形成一些数据包时也会发生这种情况。我在这里缺少更好/更常见/更容易接受的技术吗?还是我可以搜索的一些术语?

1
C语言中C ++模板类型API的惯用包装
我正在包装一个C ++ API,该API提供对C函数中的数据存储(Hazelcast)的访问,以便也可以从仅C代码中访问数据存储。 用于Map数据结构的Hazelcast C ++ API如下所示: auto map = hazelcastClient->client->getMap<int, string>(mapName); map.put(key, value); 它使用key和和的模板类型value。由于C中没有可用的模板,因此我考虑为该getMap<T, U>方法的每种特殊化创建包装函数。也就是说,对于每种C类型。虽然我知道有signed和unsignedC型的版本,我很好限制API仅支持int,double,float,char *为key和value。 所以我写了一个小脚本,可以自动生成所有组合。导出的函数如下所示: int Hazelcast_Map_put_int_string( Hazelcast_Client_t *hazelcastClient, const char *mapName, int key, char *value, char** errptr ); int Hazelcast_Map_put_int_int( Hazelcast_Client_t *hazelcastClient, const char *mapName, int key, int value, char** errptr ); ... 生成功能get,set,contains与所有可能的组合key和value种类增加了代码的数量相当多,虽然我觉得生成的代码是一个好主意,它具有创造某种代码生成的基础设施增加了额外的复杂性。 我可以想象的另一个想法是C中的一个泛型函数,如下所示: int …
9 c++  c  api-design 

1
银行实际上将什么用作货币数据类型?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 我知道一些不错的选择: 大整数(例如int64_t,mpz_t,任何bignum lib)代表美分或10 -n美分-例如,整数代表1分钱的1分钱(1.05美元== 10500)。这称为缩放整数。 用于任意精度十进制算术的高级库,例如Java中的BigDecimal,Python中的Decimal,Javascript中的decimal.js,C ++中的boost :: multiprecision 字符串。 打包的BCD(二进制编码的十进制)是一种更加神秘的方法,在旧软件中似乎很流行。了解 更多 关于它。 在银行(或信用卡,ATM,POS系统)的生产代码中,实际使用最多的数据类型是什么?我特别要问那些为银行工作的人。 编辑:对于那些具有相同问题域的超级有用的链接(需要实现不中断的“金钱”数据结构)。 http://martinfowler.com/eaaDev/quantity.html http://www.codeproject.com/Articles/28244/A-Money-type-for-the-CLR http://c2.com/cgi/wiki?MoneyObject http://www.setfiremedia.com/blog/7-top-tips-for-coding-with-currency http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html 编辑说这是一个重复问题的同伴:这是一个实际的问题,而不是“什么是最好的”的理论问题。阅读我问题的未编辑标题。我问的是人们在银行的代码库中亲眼目睹了什么。 我知道BigDecimal显然是“最佳”的,但是类似的漂亮API并非随处可见,不管您信不信,并且十进制库相对于int而言昂贵。

3
C的“真实”变量大小有用吗?
一直以来,我一直将C的积极特性(实际上是它的实现,如gcc,clang等)打动我的一件事是,它在运行时不会在您自己的变量旁边存储任何隐藏信息。我的意思是,例如,如果您想要类型为“ uint16_t”的变量“ x”,则可以确定“ x”将仅占用2个字节的空间(并且不会携带任何隐藏信息,例如其类型等) )。同样,如果要使用100个整数的数组,则可以确保它与100个整数一样大。 但是,我越想为此功能提出具体的用例,就越想知道它实际上是否具有任何实际优势。到目前为止,我唯一能想到的就是它显然需要更少的RAM。对于有限的环境(例如AVR芯片等),这无疑是一个巨大的优势,但是对于日常的台式机/服务器用例而言,这似乎无关紧要。我正在考虑的另一种可能性是,它对于访问硬件或映射内存区域(例如,用于VGA输出等)可能很有用/至关重要。 我的问题:没有此功能,是否有任何具体的领域无法实现或只能非常繁琐地实现? 附言:请告诉我您是否有更好的名字!;)

5
声明一个volatile变量是什么意思?
许多低级程序使用volatile关键字来进行内存映射的类型等,但是我对其在后台真正执行操作感到困惑。换句话说,当编译器没有“优化”内存地址时,这意味着什么?
9 c++  c  low-level 

8
是什么阻止了C的编译/解释/ JIT处理?
Java经常以其惊人的可移植性而受到赞誉,我认为这是因为JVM。我的问题是阻止C进行编译/解释/ JIT的原因是什么,如果是这样,C也可以编写一次并使其在您拥有的任何设备上工作。但这不是处理C程序的流行机制。 用这种方式处理C的缺点是什么,当然除了可移植性以外,用这种方式处理Java而不编译为机器代码的优点是什么?

4
在C中省略“析构函数”是否会使YAGNI过分?
我正在使用类似于OO的技术来开发C中的嵌入式媒体应用程序。我的“类”是.h / .c模块,它们使用数据结构和函数指针结构来模拟封装,多态和依赖项注入。 现在,人们期望一个myModule_create(void)功能会与之myModule_destroy(pointer)对应。但是,在嵌入的项目中,切勿释放实际实例化的资源。 我的意思是,如果我有4个UART串行端口,并使用所需的引脚和设置创建4个UART实例,则绝对没有理由要在运行时的某个时候销毁UART#2。 因此,遵循YAGNI(您将不需要它)原则,我应该省略析构函数吗?这对我来说似乎很奇怪,但我想不出对他们有什么用。设备下电后释放资源。

5
如何使从外部访问函数显而易见?
这是一个特定于C的问题。我试图将所有可能的内容都保留在翻译单元的边界之内,仅通过.h文件公开一些功能。也就是说,我正在static链接到文件级对象。 现在,其他模块需要调用几个函数,而不是直接调用。我的模块/文件/翻译单元订阅其他模块,将指针传递给函数。然后,在发生特定事件时,将使用一些参数来调用指针。 因此,我想知道如何使这些功能从某个晦涩难懂的位置调用变得非常明显。 它们应该是static还是extern(并将它们显示在中.h)? 我应该在函数名称中包含一些提示吗? 还是发表一个“由X调用”的评论就足够了?

2
C标准递归考虑一致性的原因是什么?
C99标准在6.5.16:2中指出: 赋值运算符的左值应为可修改的左值。 并在6.3.2.1:1中: 可修改的左值是不具有数组类型,不完整的类型,不具有const限定类型的左值,并且如果是结构或联合,则不具有任何成员(递归包括任何成员)或const限定类型的所有包含的集合或联合的元素)。 现在,让我们考虑一个非const struct带const字段。 typedef struct S_s { const int _a; } S_t; 按照标准,以下代码是未定义行为(UB): S_t s1; S_t s2 = { ._a = 2 }; s1 = s2; 这样做的语义问题是,根据实体(struct)的声明类型,应将包围实体()视为可写(非只读S_t s1),但不应通过标准措辞将其视为可写(第2条在顶部),因为const现场_a。对于读代码的程序员,该标准不清楚,该赋值实际上是一个UB,因为无法分辨出struct S_s ... S_t类型的定义是不可能的。 此外,无论如何,仅以语法方式强制执行对该字段的只读访问。不可能const将非字段的某些部分const struct真正放置到只读存储中。但是这样的标准措辞使故意丢弃const这些字段的访问程序中的字段限定符的代码无效,就像这样(对C中的结构字段进行const限定是一个好主意吗?): (*) #include <stdlib.h> #include <stdio.h> typedef struct S_s { const int _a; } S_t; …
9 design  c 

1
标题中的宏函数与静态函数
对于许多可以使用函数的快速任务f(x,y),在纯C中使用宏。我想具体询问这些情况,这些情况可以通过函数调用解决(即,用于内联函数的宏,而不是用于任意代码的代码扩展的宏)。 通常不内联C函数,因为它们可能是从其他C文件链接到的。但是,静态C函数仅在定义它们的C文件中可见。因此,编译器可以内联它们。我听说,应该将许多宏替换为静态函数,因为它们会生成更安全的代码。 在某些情况下这不是一个好主意吗? 再说一遍:根本不问具有完全无法表示为函数的具有##相似构造的Code-Production宏。
9 c 

6
我的团队是否应该使用一些公认的通用编码标准作为自己的基础?
我所在的研发团队已决定采用编码标准。我们只是最近才成立的,我们自己的代码和通用编码时间太少,无法将我们的标准/惯例文档建立在我们团队有机发展的基础上,也无法借鉴我们自己的代码中的良好示例等。 现在,我们每个人都有一些过去工作场所的经验-尽管我们每个人都没有处于这样一种状态:“让我们在这里采用这份全面的文件,我发现它适合我们在这里从事的工作”(*)。另外,我们中的某些人(包括我本人)只有没有官方编码标准的地方的经验,或者在不同的环境中用不同的语言编写(高压每周发布的生产环境,而不是更加注重研究的开发工作) 因此,我一直在考虑的一种选择是获取一个相对知名且备受关注的文档,剪掉我们不在乎/关心的内容,并根据我们的偏好进行一些修改。 这是常见的做法吗?您认为这是个好主意吗?如果是这样,那将是一个合理的“基准”编码标准(不要告诉我哪个是最好的,我不想在这里引发宗教冲突;只需指出可以在其基础上进行全面或“中立”的内容) ) 笔记: 我们希望可以使用C,C ++,OpenCL,CUDA,Python。 我们是一个由4人+经理组成的团队,预计在一年左右的时间内增长到大约5-6。 在我们公司中,团队几乎完全是自治的,通常根本不互动(甚至不使用彼此的代码-工作是在完全不同的项目上);所以-没有公司范围内的考虑。 关于工具,目前我们知道我们将使用Eclipse,因此它的代码格式化程序至少将成为一种工具。Ctrl + Shift + F很久以来就是我的朋友 在编写Java时,我采用了尽可能严格遵循Bloch的Effective Java的做法。现在,这还不是一个编码标准,但是您可以将一些砖,水泥和砂浆称为编码标准。我当时正在考虑将类似的内容作为“混合”的一部分(注意我们不使用Java)。 我指的是更广泛意义上的编码标准,例如采用对P.SE问题的回答中提出的建议。 我找到了大量的C ++编码标准文档 ; 也许我应该挖掘我们的基线。 (*)并非完全正确,但我不想使这个问题复杂化。

3
C库函数的原理从不将errno设置为零
C标准要求不得将C标准库功能设置errno为零。为什么会这样呢? 我可以理解它对于调用多个函数以及仅errno在最后一个函数之后进行检查很有用-例如: errno = 0; double x = strtod(str1, NULL); long y = strtol(str2, NULL); if (errno) // either "strtod" or "strtol" failed else // both succeeded 但是,这不是“坏习惯”吗?由于只errno在最后进行检查,因此您只知道其中一个功能确实失败了,但哪个功能失败了。仅仅是知道某些失败对于大多数实际程序而言已经足够好了吗? 我尝试查找各种​​C Rational文档,但是其中许多文档没有太多详细信息<errno.h>。
9 c  standards 

3
一个很好的C可变长度数组示例[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 这个问题在SO上引起了不小的反响,所以我决定在那里删除它,然后在这里尝试。如果您认为它也不适合此处,请至少对如何找到我所追求的示例提出建议... 您能举个例子吗,使用C99 VLA相对于当前的标准堆(使用C ++ RAII机制)提供了真正的优势? 我遵循的示例应: 与使用堆相比,可轻松实现(可能达到10%)的性能优势。 没有一个好的解决方法,它根本不需要整个数组。 实际受益于使用动态尺寸,而不是固定的最大尺寸。 在正常使用情况下,不太可能导致堆栈溢出。 足够强大,足以吸引需要性能的开发人员在C ++项目中包含C99源文件。 在上下文中添加了一些说明:我的意思是C99所指的VLA,但不包括在标准C ++中:int array[n]这里n是变量。在一个用例示例中,我胜过其他标准(C90,C ++ 11)提供的替代方案: int array[MAXSIZE]; // C stack array with compile time constant size int *array = calloc(n, sizeof int); // C heap array with manual free int *array = new int[n]; // …
9 c++  c  stack  heap 

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.