Questions tagged «c»

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

3
为什么sizeof int是错误的,而sizeof(int)是正确的呢?
我们知道这sizeof是一个用于计算任何数据类型和表达式的大小的运算符,并且当操作数是表达式时,可以省略括号。 int main() { int a; sizeof int; sizeof( int ); sizeof a; sizeof( a ); return 0; } 第一种用法sizeof是错误的,而其他用法是正确的。 使用gcc进行编译时,将显示以下错误消息: main.c:5:9: error: expected expression before ‘int’ 我的问题是,为什么C标准不允许这种操作。会sizeof int引起歧义吗?
96 c++  c  sizeof 

1
struct声明末尾的[1]的目的是什么?
我正在窥探MSP430微控制器的头文件,并且在<setjmp.h>以下位置遇到了这个问题: /* r3 does not have to be saved */ typedef struct { uint32_t __j_pc; /* return address */ uint32_t __j_sp; /* r1 stack pointer */ uint32_t __j_sr; /* r2 status register */ uint32_t __j_r4; uint32_t __j_r5; uint32_t __j_r6; uint32_t __j_r7; uint32_t __j_r8; uint32_t __j_r9; uint32_t __j_r10; uint32_t __j_r11; } …

6
为什么将值分配给位字段却没有返回相同的值?
我在Quora帖子中看到了以下代码: #include <stdio.h> struct mystruct { int enabled:1; }; int main() { struct mystruct s; s.enabled = 1; if(s.enabled == 1) printf("Is enabled\n"); // --> we think this to be printed else printf("Is disabled !!\n"); } 在C和C ++中,代码的输出都是意外的, 被禁用 !! 尽管在那篇文章中给出了与“符号位”相关的解释,但我无法理解,我们可能会设置一些东西,然后又不能按原样反映。 有人可以给出更详细的解释吗? 注意:两个标签C 和 C ++因为它们的描述位域的标准略有不同,所以是必需的。请参阅有关C规范和C ++规范的答案。

7
fread / fwrite以大小和数量为参数的基本原理是什么?
我们在这里讨论了为什么fread和fwrite占用每个成员的大小,然后计数并返回读取/写入的成员数,而不仅仅是获取缓冲区和大小。我们能想到的唯一用途是,如果您想读/写一个数组数组,这些数组不能被平台对齐均匀地整除,因此已经被填充了,但是不能如此普遍以至于不能保证这种选择在设计中。 从FREAD(3): 函数fread()从stream指向的流中读取每个长度为字节大小的nmemb数据元素,并将它们存储在ptr给定的位置。 函数fwrite()将每个长度为字节的nmemb数据元素写入stream指向的流,并从ptr给定的位置获取它们。 fread()和fwrite()返回成功读取或写入的项目数(即,不是字符数)。如果发生错误或到达文件末尾,则返回值是短项计数(或零)。
96 c  libc 

3
在C中创建一个新目录
我想编写一个检查目录是否存在的程序;如果该目录不存在,那么它将在其中创建目录和一个日志文件,但是如果该目录已经存在,则它将在该文件夹中创建一个新的日志文件。 我如何在Linux中用C做到这一点?
96 c  linux  directory 


13
如何摆脱嵌套循环?
如果我使用一条break语句,它将仅中断内部循环,而我需要使用一些标志来中断外部循环。但是,如果有许多嵌套循环,则代码将看起来不好。 还有其他方法可以打破所有循环吗?(请不要使用goto stmt。) for(int i = 0; i < 1000; i++) { for(int j = 0; j < 1000; j++) { if(condition) { // both of the loops need to break and control will go to stmt2 } } } stmt2
96 c  nested-loops  break 

6
Visual Studio中的C编程
我可以使用Visual Studio学习C编程吗?在新的项目菜单中,我可以在Visual Basic,Visual C#,Visual C ++,Visual F#和其他之间进行选择,但看不到“ C”或“ Visual C”。
96 c  visual-studio 

7
setjmp和longjmp在C中的实际用法
谁能解释我在嵌入式编程中实际可以使用的确切位置setjmp()和longjmp()功能吗?我知道这些用于错误处理。但我想知道一些用例。
96 c 

3
在C99中,没有“静态”或“外部”的“内联”曾经有用吗?
当我尝试构建此代码时 inline void f() {} int main() { f(); } 使用命令行 gcc -std=c99 -o a a.c 我收到一个链接器错误(对的未定义引用f)。如果我使用static inline或extern inline而不是just inline,或者使用进行编译,则该错误消失-O(因此该函数实际上是内联的)。 这种行为似乎在C99标准的6.7.4(6)段中定义: 如果翻译单元中某个函数的所有文件范围声明都包含inline不带的函数说明符extern,则该翻译单元中的定义为内联定义。内联定义不为函数提供外部定义,也不禁止在另一个翻译单元中使用外部定义。内联定义提供了外部定义的替代方法,翻译器可以使用该替代方法在同一翻译单元中实现对该函数的任何调用。未指定对函数的调用是使用内联定义还是使用外部定义。 如果我正确理解了所有这些内容,则具有inline上面示例中定义的功能的编译单元仅在存在相同名称的外部函数的情况下一致地编译,并且我永远不知道自己的函数还是外部函数被调用。 这种行为不是完全愚蠢吗?在inline不使用C99的情况下static或extern在C99中定义功能是否有用?我想念什么吗? 答案摘要 当然,我错过了一些东西,而且行为也不愚蠢。:) 正如Nemo解释的那样,想法是放置函数的定义 inline void f() {} 在头文件中,只有一个声明 extern inline void f(); 在相应的.c文件中。仅extern声明触发外部可见的二进制代码的生成。inline在.c文件中确实没有使用-仅在标头中有用。 正如乔纳森回答中所引用的C99委员会的基本原理所阐明的那样,inline所有内容都与编译器优化有关,该优化要求函数定义在调用现场可见。这只能通过将定义放在标头中来实现,当然,标头中的定义一定不能在每次编译器看到它时都发出代码。但是由于没有强制编译器实际内联函数,因此外部定义必须存在于某处。
96 c  inline  c99 


5
如何增加指针地址和指针的值?
让我们假设 int *p; int a = 100; p = &a; 以下代码将实际执行什么操作以及如何执行? p++; ++p; ++*p; ++(*p); ++*(p); *p++; (*p)++; *(p)++; *++p; *(++p); 我知道,这在编码方面有点麻烦,但是我想知道当我们这样编码时实际会发生什么。 注意:假设的地址a=5120300存储在p地址为的指针中3560200。现在,p & a每条语句执行后的值是多少?
96 c  pointers 


13
如何在预处理器宏中使用“ sizeof”?
有什么方法可以sizeof在预处理器宏中使用吗? 例如,多年来,我想做很多事情,例如: #if sizeof(someThing) != PAGE_SIZE #error Data structure doesn't match page size #endif 我在这里检查的确切内容已完全组成-重点是,我经常喜欢放入这些类型的(大小或对齐)编译时检查,以防止有人修改数据结构而导致对齐或重新对齐的情况。大小会破坏它们的东西。 不用说-我似乎无法以sizeof上述方式使用。
95 c  gcc 

6
C中的代字号运算符
我已经看到了ELF哈希算法中使用的波浪号运算符,并且很好奇它的作用。(代码来自“永恒困惑”。) unsigned elf_hash ( void *key, int len ) { unsigned char *p = key; unsigned h = 0, g; int i; for ( i = 0; i < len; i++ ) { h = ( h << 4 ) + p[i]; g = h & 0xf0000000L; if ( g …
95 c++  c  operators 

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.