Questions tagged «c»

C是用于系统编程(OS和嵌入式),库,游戏和跨平台的通用编程语言。该标记应与ISO 9899标准(除非另有说明,最新版本9899:2018中定义的有关C语言的一般问题)一起使用-还要使用c89,c99,c11等标记特定于版本的请求。C与C ++截然不同,在没有合理理由的情况下,不应将其与C ++标记结合使用。

9
自我参照结构定义?
我已经很长时间没有写C了,所以我不确定应该如何去做这些递归的事情……我希望每个单元格都包含另一个单元格,但是随着“字段'child'的行类型不完整”。这是怎么回事? typedef struct Cell { int isParent; Cell child; } Cell;
134 c  recursion  struct  typedef 

3
从函数返回结构时可能的GCC错误
我相信我在实施O'Neill的PCG PRNG时发现了GCC中的错误。(Godbolt的Compiler Explorer上的初始代码) 相乘后oldstate通过MULTIPLIER,(存储在RDI结果),GCC不该结果添加到INCREMENT,movabs'ing INCREMENT到RDX代替,然后把它用作rand32_ret.state的返回值 一个最小的可复制示例(Compiler Explorer): #include <stdint.h> struct retstruct { uint32_t a; uint64_t b; }; struct retstruct fn(uint64_t input) { struct retstruct ret; ret.a = 0; ret.b = input * 11111111111 + 111111111111; return ret; } 生成的程序集(GCC 9.2,x86_64,-O3): fn: movabs rdx, 11111111111 # multiplier constant (doesn't fit in …
133 c  gcc  assembly  x86-64  compiler-bug 

7
为什么“ sizeof(a?true:false)”给出四个字节的输出?
我有一小段关于sizeof三元运算符的代码: #include <stdio.h> #include <stdbool.h> int main() { bool a = true; printf("%zu\n", sizeof(bool)); // Ok printf("%zu\n", sizeof(a)); // Ok printf("%zu\n", sizeof(a ? true : false)); // Why 4? return 0; } 输出(GCC): 1 1 4 // Why 4? 但在这里, printf("%zu\n", sizeof(a ? true : false)); // Why 4? 三元运算符返回booleantype,sizeof …

18
谁会何时使用工会?是仅C语言时代的残余吗?
我学到了,但并没有真正得到工会。我遍历的每一个C或C ++文本都对它们进行了介绍(有时会进行介绍),但是它们却很少给出为什么或在何处使用它们的实际示例。工会在现代(甚至是传统)案例中什么时候有用?我仅有的两个猜测是,当您的工作空间非常有限时,或者当您开发API(或类似的东西)时,您想强迫最终用户在多个对象/类型中只有一个实例时,对微处理器进行编程一度。这两个猜测是否接近正确?
133 c++  c  unions 

3
如何打印uint64_t?失败:“格式中的虚假结尾'%'”
我写了一个非常简单的printf uint64_t测试代码: #include <inttypes.h> #include <stdio.h> int main() { uint64_t ui64 = 90; printf("test uint64_t : %" PRIu64 "\n", ui64); return 0; } 我使用ubuntu 11.10(64位)和gcc版本4.6.1对其进行编译,但失败了: main.cpp: In function ‘int main()’: main.cpp:9:30: error: expected ‘)’ before ‘PRIu64’ main.cpp:9:47: warning: spurious trailing ‘%’ in format [-Wformat]
133 c++  c 

16
Windows线程:_beginthread与_beginthreadex与CreateThread C ++
什么是更好的方式来启动一个线程,_beginthread,_beginthreadx或CreateThread? 我试图确定什么是优势/劣势_beginthread,_beginthreadex和CreateThread。所有这些函数都将线程句柄返回到新创建的线程,我已经知道,当发生错误时(可以通过调用来检查GetLastError),CreateThread提供了一些额外的信息。米使用这些功能? 我正在使用Windows应用程序,因此跨平台兼容性已经成为不可能。 我已经阅读了msdn文档,例如,我什至不明白为什么有人会决定使用_beginthread而不是CreateThread,反之亦然。 干杯! 更新:OK,所有的信息,谢谢,我也看到了在几个地方,我不能打电话WaitForSingleObject(),如果我使用的_beginthread(),但如果我呼吁_endthread()在线程不应该工作?那有什么事
133 c++  c  multithreading  winapi 

7
为什么编译器不能(或不能)将可预测的加法循环优化为乘法?
这是在阅读Mysticial关于该问题的绝妙答案时想到的一个问题:为什么处理排序数组比未排序数组更快? 涉及的类型的上下文: const unsigned arraySize = 32768; int data[arraySize]; long long sum = 0; 他在回答中解释说,英特尔编译器(ICC)对此进行了优化: for (int i = 0; i < 100000; ++i) for (int c = 0; c < arraySize; ++c) if (data[c] >= 128) sum += data[c]; ...变成这样的东西: for (int c = 0; c < arraySize; ++c) …

6
在C到毫秒之间是否有替代的睡眠功能?
我有一些在Windows上编译的源代码。我将其转换为可在Red Hat Linux上运行。 源代码包括<windows.h>头文件,并且程序员使用该Sleep()函数等待毫秒的时间。这在Linux上不起作用。 但是,我可以使用该sleep(seconds)函数,但是它使用整数(以秒为单位)。我不想将毫秒转换为秒。我可以在Linux上的gcc编译中使用其他睡眠功能吗?
133 c  linux  sleep 

3
LLVM与OS X上的clang
我对OS X上的llvm,clang和gcc有疑问。 llvm-gcc 4.2,llvm 2.0和clang有什么区别?我知道它们都基于llvm构建,但是它们有何不同? 除了更快的编译速度之外,llvm与gcc相比还有什么优势?
133 c++  c  gcc  llvm  clang 



25
为什么有人会在C ++上使用C?[关闭]
从目前的情况来看,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 尽管人们似乎喜欢抱怨 C ++,但是我仍然找不到很多证据来证明为什么您会选择C而不是C ++。C似乎并没有那么强大,如果C ++遇到所有这些问题,为什么不将自己局限于C子集呢?您的想法/经验是什么?
132 c++  c 

10
在C中实现字典的快速方法
在用C编写程序时,我想念的一件事就是字典数据结构。用C实现一个最方便的方法是什么?我不是在寻找性能,而是希望从头开始编写它。我也不希望它是通用的-像string-> int这样的东西。但是我确实希望它能够存储任意数量的项目。 这更多地是作为练习。我知道有可用的第三方库。但是请考虑片刻,它们不存在。在这种情况下,实现满足上述要求的字典的最快方法是什么。

13
如何制作不会被优化的无限空循环?
C11标准似乎暗示不应优化具有恒定控制表达式的迭代语句。我从这个答案中获取建议,该答案特别引用了标准草案的6.8.5节: 该实现可以假定其控制表达式不是常量表达式...的迭代语句终止。 在该答案中,它提到while(1) ;不应对循环进行优化。 那么...为什么Clang / LLVM优化了下面的循环(与编译cc -O2 -std=c11 test.c -o test)? #include <stdio.h> static void die() { while(1) ; } int main() { printf("begin\n"); die(); printf("unreachable\n"); } 在我的机器上,此打印输出begin,然后在一条非法指令(ud2位于后面的陷阱die())中崩溃。在godbolt上,我们可以看到调用之后什么也没有产生puts。 让Clang在下面输出无限循环是一件非常困难的任务-O2-虽然我可以重复测试一个volatile变量,但该变量涉及不需要的内存读取。如果我做这样的事情: #include <stdio.h> static void die() { while(1) ; } int main() { printf("begin\n"); volatile int x = 1; if(x) die(); …

19
倒数比倒数快吗?
我们的计算机科学老师曾经说过,由于某种原因,倒数比倒数更有效。例如,如果您需要使用FOR循环,而循环索引未在某处使用(例如在屏幕上打印N *行),则表示这样的代码: for (i = N; i >= 0; i--) putchar('*'); 优于: for (i = 0; i < N; i++) putchar('*'); 是真的吗 如果是这样,有人知道为什么吗?
131 c  performance  loops 

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.