Questions tagged «c»

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


7
是否必须使逻辑运算符短路?和评估顺序?
ANSI标准是否要求在C或C ++中使逻辑运算符短路? 我很困惑,因为我回想起K&R的书,说您的代码不应该依赖这些操作的短路,因为它们可能不是。有人可以指出标准中逻辑运算总是短路的地方吗?我对C ++最为感兴趣,对于C的回答也很好。 我还记得读(不记得在哪里)未严格定义评估顺序,因此您的代码不应依赖或假定表达式中的函数将按特定顺序执行:在语句末尾,所有引用的函数会被调用,但是编译器可以自由选择最有效的顺序。 标准是否指示此表达式的评估顺序? if( functionA() && functionB() && functionC() ) cout<<"Hello world";


7
C中的枚举的大小是多少?
我正在创建一组枚举值,但是我需要每个枚举值都是64位宽。如果我没记错的话,枚举的大小通常与int相同;但是我想我读过某个地方(至少在GCC中),编译器可以使枚举具有保持其值所需的任何宽度。那么,是否可能有一个64位宽的枚举?
140 c  enums 

9
为什么将switch语句设计为需要中断?
给出一个简单的switch语句 switch (int) { case 1 : { printf("1\n"); break; } case 2 : { printf("2\n"); } case 3 : { printf("3\n"); } } 在情况2中没有break语句,这意味着将在情况3的代码内继续执行。它是这样设计的。为什么做出这个决定?与为块提供自动中断语义相比,这有什么好处?有什么根据?
139 c  language-design 

11
使用过时的C编译器会带来安全风险吗?
我们生产中的一些构建系统没人关心,这些机器运行的是GCC 3或GCC 2等古老版本的GCC。 而且我不能说服管理层将其升级到最新版本:他们说,“如果还没有破产,就不要修复它”。 由于我们维护了非常古老的代码库(写于80年代),因此C89代码在这些编译器上可以很好地进行编译。 但是我不确定使用这些旧内容是个好主意。 我的问题是: 使用旧的C编译器会损害已编译程序的安全性吗? 更新: Visual Studio 2008为Windows目标构建了相同的代码,MSVC尚不支持C99或C11(我不知道是否有更新的MSVC支持),并且可以使用最新的GCC在Linux机器上构建它。因此,如果我们只使用更新的GCC,它的构建可能会和以前一样好。
139 c  security  gcc 

16
您如何在C中实现类?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 12个月前关闭。 改善这个问题 假设我必须使用C(没有C ++或面向对象的编译器)并且没有动态内存分配,那么我可以使用哪些技术来实现一个类,或者可以很好地近似一个类?将“类”隔离到单独的文件中总是一个好主意吗?假设我们可以通过假设固定数量的实例,甚至在编译之前将对每个对象的引用定义为常量来预分配内存。随意假设我需要实现哪种OOP概念(它会有所不同),并为每种概念提供最佳方法。 限制条件: 我必须使用C而不是OOP,因为我正在为嵌入式系统编写代码,并且编译器和预先存在的代码库都在C中。 没有动态内存分配,因为我们没有足够的内存来合理地假设如果我们开始动态分配它就不会用光。 我们使用的编译器在函数指针方面没有问题
139 c  class  oop  embedded 

18
Linux中的itoa函数在哪里?
itoa()是将数字转换为字符串的真正方便的函数。Linux似乎没有itoa(),是否有等效的功能或者我必须使用sprintf(str, "%d", num)?
139 c  linux 

2
如何在C中从串行端口打开,读取和写入?
我对读取和写入串行端口有些困惑。我在Linux中有一个使用FTDI USB串行设备转换器驱动程序的USB设备。当我插入它时,它将创建:/ dev / ttyUSB1。 我认为用C打开和读取它很简单。我知道波特率和奇偶校验信息,但是似乎没有标准吗? 我是否缺少某些东西,或者有人可以指出正确的方向?
139 c  linux  serial-port 

5
什么是C中的目标文件?
我正在阅读有关C语言中的库的信息,但尚未找到关于什么是目标文件的解释。其他任何编译文件和目标文件之间的真正区别是什么? 如果有人可以用人类的语言解释,我会很高兴。

12
适用于gdb调试器的大多数棘手/有用的命令[关闭]
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 您可以在运行调试器(如gdb或dbx)时发布最棘手和最有用的命令吗?
138 c  unix  gdb  debugging  dbx 

5
编写程序以应对导致Linux上的写入丢失的I / O错误
TL; DR:如果Linux内核丢失了缓冲的I / O写操作,那么应用程序有什么方法可以找出来? 我知道您必须fsync()对该文件(及其父目录)具有持久性。问题是,如果内核由于I / O错误而丢失了待写的脏缓冲区,那么应用程序如何检测到它并恢复或中止? 考虑数据库应用程序等,其中写入顺序和写入持久性可能至关重要。 丢了写?怎么样? 在某些情况下,Linux内核的块层失去缓冲已被成功提交的I / O请求write(),pwrite()等等,有这样的错误: Buffer I/O error on device dm-0, logical block 12345 lost page write due to I/O error on dm-0 (请参阅end_buffer_write_sync(...)和end_buffer_async_write(...)中的fs/buffer.c)。 在较新的内核上,该错误将包含“丢失异步页面写入”,例如: Buffer I/O error on dev dm-0, logical block 12345, lost async page write 由于应用程序write()将已经返回且没有错误,因此似乎无法将错误报告给应用程序。 检测到他们? 我对内核源代码并不熟悉,但是我认为AS_EIO它是在异步写入失败的缓冲区上设置的: set_bit(AS_EIO, &page->mapping->flags); …
138 c  linux  linux-kernel  posix 

2
为什么C ++的初始分配比C大得多?
当使用相同的代码时,只需更改编译器(从C编译器到C ++编译器)将更改分配的内存量。我不太确定为什么会这样,并且想进一步了解它。到目前为止,我得到的最好的答复是“可能是I / O流”,它不是很具描述性,使我想知道C ++的“您不用为不使用的东西付钱”。 我正在使用分别为7.0.1-8和8.3.0-6的Clang和GCC编译器。我的系统在最新的Debian 10(Buster)上运行。基准通过Valgrind Massif完成。 #include <stdio.h> int main() { printf("Hello, world!\n"); return 0; } 所使用的代码不会更改,但是无论我是以C还是C ++进行编译,它都会更改Valgrind基准测试的结果。但是,这些值在编译器之间保持一致。该程序的运行时分配(峰值)如下: GCC(C):1,032字节(1 KB) G ++(C ++):73,744字节(〜74 KB) lang(C):1,032字节(1 KB) Clang ++(C ++):73,744字节(〜74 KB) 为了进行编译,我使用以下命令: clang -O3 -o c-clang ./main.c gcc -O3 -o c-gcc ./main.c clang++ -O3 -o cpp-clang ./main.cpp g++ -O3 …
138 c++  c  benchmarking 


3
如何在Linux中编译静态库?
我有一个问题:如何在Linux中使用编译静态库gcc,即我需要将源代码编译成名为out.a的文件。仅使用命令编译就足够了gcc -o out.a out.c吗?我不太熟悉gcc,希望任何人都可以帮助我。
138 c  gcc  static-libraries 

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.