Questions tagged «c»

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

7
标准委员会关注的异国架构
我知道C和C ++标准留下了语言实现定义的许多方面,只是因为如果存在具有其他特征的体系结构,那么将很难或不可能为其编写符合标准的编译器。 我知道40年前,任何计算机都有其自己的独特规范。但是,我不知道今天使用的任何架构在哪里: CHAR_BIT != 8 signed 不是两个的补码(我听说Java对此有问题)。 浮点不符合IEEE 754(编辑:我的意思是“不是采用IEEE 754二进制编码”)。 我问的原因是,我经常向人们解释,C ++不要求其他任何低级方面(例如固定大小的类型†)是很好的。很好,因为与“其他语言”不同,它可以使您的代码在正确使用时可移植(编辑:因为可以将其移植到更多体系结构中,而无需模拟机器的低级方面,例如,符号+幅值体系中的二进制补码算法) 。但是我很难为自己不能指出任何特定的体系结构。 所以问题是:哪些架构具有上述特性? † uint*_t是可选的。
154 c++  c  architecture 

5
Valgrind检测到仍可达到泄漏
该块中提到的所有功能都是库功能。我该如何纠正此内存泄漏? 它在“ 仍可访问 ”类别下列出。(还有4个,它们非常相似,但是大小不同) 630 bytes in 1 blocks are still reachable in loss record 5 of 5 at 0x4004F1B: calloc (vg_replace_malloc.c:418) by 0x931CD2: _dl_new_object (dl-object.c:52) by 0x92DD36: _dl_map_object_from_fd (dl-load.c:972) by 0x92EFB6: _dl_map_object (dl-load.c:2251) by 0x939F1B: dl_open_worker (dl-open.c:255) by 0x935965: _dl_catch_error (dl-error.c:178) by 0x9399C5: _dl_open (dl-open.c:584) by 0xA64E31: do_dlopen (dl-libc.c:86) …
154 c  pthreads  valgrind 


6
NS在iPhone中使用Objective-C记录方法名称
当前,我们正在为自己定义一个扩展的日志机制,以打印出日志的类名和源行号。 #define NCLog(s, ...) NSLog(@"<%@:%d> %@", [[NSString stringWithUTF8String:__FILE__] lastPathComponent], \ __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__]) 例如,当我调用NCLog(@“ Hello world”);时,输出将是: <ApplicationDelegate:10>Hello world 现在,我还想注销方法名称,例如: <ApplicationDelegate:applicationDidFinishLaunching:10>Hello world 因此,当我们知道要调用哪个方法时,这将使调试变得更容易。我知道我们也有Xcode调试器,但是有时我也想通过注销来进行调试。

11
〜x +〜y ==〜(x + y)始终为假?
此代码是否总是评估为false?这两个变量都是二进制补码整数。 ~x + ~y == ~(x + y) 我觉得应该有一些数字可以满足条件。我尝试测试之间的数字-5000,5000但从未实现平等。有没有办法建立方程式来找到条件的解? 将一个交换为另一个会在我的程序中引起隐患吗?

9
在C语言中,花括号是否充当堆栈框架?
如果我在一组新的花括号中创建一个变量,那么该变量是从右括号中弹出的堆栈,还是一直挂到函数结尾?例如: void foo() { int c[100]; { int d[200]; } //code that takes a while return; } d在本code that takes a while节中会占用内存吗?
153 c  memory  stack 

9
什么是C中的“回调”以及如何实现?
根据我的读物,Core Audio在很大程度上依赖于回调(和C ++,但这是另一回事)。 我了解设置功能的概念(某种程度上),该功能被另一个功能反复调用以完成任务。我只是不了解他们如何设置以及他们如何实际工作。任何示例将不胜感激。
153 c  callback 

14
在C / C ++中检查NULL指针[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引文回答。 5年前关闭。 改善这个问题 在最近的代码审查中,贡献者试图强制NULL以下列方式执行对指针的所有检查: int * some_ptr; // ... if (some_ptr == NULL) { // Handle null-pointer error } else { // Proceed } 代替 int * some_ptr; // ... if (some_ptr) { // Proceed } else { // Handle null-pointer error } 我同意他的方法在某种意义上更为清晰,因为它明确地说“确保此指针不为NULL”,但我要反驳这一点,说的是从事此代码工作的任何人都将理解在指针中使用指针变量。if语句隐式检查NULL。我也觉得第二种方法引入类似漏洞的可能性较小: if (some_ptr = NULL) 这只是查找和调试的绝对痛苦。 …

13
有哪些工具可以用C进行功能编程?
最近我一直在思考如何使用C(而不是 C ++)进行函数式编程。显然,C是一种过程语言,并不真正支持本机功能编程。 是否有任何编译器/语言扩展在语言中添加了一些功能性的编程构造?GCC提供嵌套功能作为语言扩展;嵌套函数可以从父堆栈框架访问变量,但这距离成熟的闭包还有很长的路要走。 例如,我认为在C语言中可能真正有用的一件事是,在需要使用函数指针的任何地方,您都可以传递lambda表达式,从而创建一个衰减为函数指针的闭包。C ++ 0x将包含lambda表达式(我认为它很棒);但是,我正在寻找适用于直C的工具。 为了明确起见,我并不是要解决C语言中更适合函数编程的特定问题。我只是想知道如果要使用哪些工具。

13
num ++是否可以对“ int num”是原子的?
通常,for int num,num++(或++num)作为读取-修改-写入操作不是原子的。但是我经常看到编译器(例如GCC)为此生成以下代码(请尝试在此处): 由于对应的第5行num++是一条指令,在这种情况下,我们可以得出结论num++ 是原子的吗? 如果是这样,是否意味着这样生成的代码num++可以在并发(多线程)场景中使用,而不会造成数据争用的危险(即,例如,我们不需要这样做,std::atomic<int>并且会产生相关的成本,因为它反正还是原子的? 更新 注意,这个问题不是增量是否是原子的(不是,那过去是,现在是问题的开头)。这是在特定情况下是否可以使用,即在某些情况下是否可以利用单指令性质来避免lock前缀的开销。并且,正如公认的答案在有关单处理器机器的部分中提到的那样,以及该答案,其注释中的对话和其他解释都可以(尽管不是使用C或C ++)。

2
如何用C预处理器连接两次并像“ arg ## _ ## MACRO”中那样扩展宏?
我正在尝试编写一个程序,其中某些函数的名称取决于具有这样的宏的某个宏变量的值: #define VARIABLE 3 #define NAME(fun) fun ## _ ## VARIABLE int NAME(some_function)(int a); 不幸的是,宏NAME()将其变成了 int some_function_VARIABLE(int a); 而不是 int some_function_3(int a); 因此,这显然是错误的解决方法。幸运的是,VARIABLE的不同可能值的数量很小,因此我可以简单地进行an #if VARIABLE == n并单独列出所有情况,但是我想知道是否有一种聪明的方法来做到这一点。

4
“ #define _GNU_SOURCE”意味着什么?
今天,我不得不使用该basename()函数,并且man 3 basename(这里)给了我一些奇怪的信息: 笔记 basename()有两种不同的版本- 上面描述的POSIX版本和GNU版本,其中一种 #define _GNU_SOURCE #include <string.h> 我想知道这#define _GNU_SOURCE是什么意思:它污染了我使用GNU相关许可证编写的代码吗?或者它只是用来告诉编译器,例如“ 嗯,我知道,这组函数不是POSIX,因此不是可移植的,但是我还是想使用它 ”。 如果是这样,为什么不给人们提供不同的标题,而不必定义一些晦涩的宏来获得一个函数实现或另一个实现呢? 有些东西也困扰着我:编译器如何知道与可执行文件链接的函数实现?它也使用这个#define吗? 有人给我一些指示吗?
152 c  posix  gnu 

22
C代码中的错误处理
在C库中以一致的方式处理错误时,您认为“最佳实践”是什么? 我一直在想两种方法: 始终返回错误代码。一个典型的函数如下所示: MYAPI_ERROR getObjectSize(MYAPIHandle h, int* returnedSize); 始终提供错误指针方法: int getObjectSize(MYAPIHandle h, MYAPI_ERROR* returnedError); 使用第一种方法时,可以编写如下代码,将错误处理检查直接放在函数调用上: int size; if(getObjectSize(h, &size) != MYAPI_SUCCESS) { // Error handling } 看起来比这里的错误处理代码更好。 MYAPIError error; int size; size = getObjectSize(h, &error); if(error != MYAPI_SUCCESS) { // Error handling } 但是,我认为使用返回值返回数据可以使代码更具可读性。很明显,第二个示例中将一些内容写入了size变量。 您是否对我为什么应该偏爱这些方法中的任何一个或可能将它们混合或使用其他方法有任何想法?我不喜欢全局错误状态,因为它会使库的多线程使用更加痛苦。 编辑:关于此的C ++特定想法也很有趣,只要它们不涉及异常,因为这对我而言目前不是一个选择...
152 c  error-handling 

7
解析/ proc /文件是否安全?
我想解析/proc/net/tcp/,但是安全吗? 我应该如何打开文件/proc/并从中读取文件,不要担心其他进程(或操作系统本身)会在同一时间对其进行更改?
152 c++  c  linux  unix  procfs 

8
使用C返回数组
我是C语言的新手,我需要一些处理数组的方法的帮助。来自Java编程,我习惯于说int [] method()可以返回一个数组。但是,我发现使用C时,必须在返回数组时使用数组指针。作为一个新的程序员,即使在我浏览过许多论坛的情况下,我也完全不理解这一点。 基本上,我试图编写一个返回C语言中的char数组的方法。我将为该方法(让其称为returnArray)提供一个数组。它将根据先前的数组创建一个新数组,并返回指向它的指针。我只需要一些有关如何启动它以及如何将指针从数组中发送出去后如何读取指针的帮助。任何帮助解释这一点表示赞赏。 数组返回函数的建议代码格式 char *returnArray(char array []){ char returned [10]; //methods to pull values from array, interpret them, and then create new array return &(returned[0]); //is this correct? } 函数的调用者 int main(){ int i=0; char array []={1,0,0,0,0,1,1}; char arrayCount=0; char* returnedArray = returnArray(&arrayCount); ///is this correct? for (i=0; …
152 c  arrays  pointers  char 

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.