标签: c

154
推荐指数
2
解决办法
8万
查看次数

C的有用GCC标志

除了设置-Wall和设置之外-std=XXX,还有什么其他真正有用的,但是在C中使用的知名度较低的编译器标志?

我对任何其他警告特别感兴趣,和/或在某些情况下将警告转换为错误,以绝对最小化任何意外类型不匹配.

c gcc compiler-flags

154
推荐指数
18
解决办法
6万
查看次数

153
推荐指数
5
解决办法
3万
查看次数

在C中按值传递结构是否有任何缺点,而不是传递指针?

在C中按值传递结构是否有任何缺点,而不是传递指针?

如果结构很大,显然存在复制大量数据的性能方面,但对于较小的结构,它应该基本上与将多个值传递给函数相同.

当用作返回值时,它可能更有趣.C只有函数的单个返回值,但是你经常需要几个.所以一个简单的解决方案是将它们放在一个结构中并返回它.

是否有任何理由支持或反对这一点?

因为对于每个人来说,我在这里谈论的内容可能并不明显,所以我举一个简单的例子.

如果您使用C编程,您迟早会开始编写如下所示的函数:

void examine_data(const char *ptr, size_t len)
{
    ...
}

char *p = ...;
size_t l = ...;
examine_data(p, l);
Run Code Online (Sandbox Code Playgroud)

这不是问题.唯一的问题是你必须同意你的同事的参数顺序,所以你在所有功能中使用相同的约定.

但是当你想要返回相同类型的信息时会发生什么?你通常得到这样的东西:

char *get_data(size_t *len);
{
    ...
    *len = ...datalen...;
    return ...data...;
}
size_t len;
char *p = get_data(&len);
Run Code Online (Sandbox Code Playgroud)

这很好,但问题更多.返回值是返回值,但在此实现中它不是.从上面没有办法说明函数get_data不允许查看len指向的内容.并且没有任何东西可以使编译器检查实际通过该指针返回的值.那么下个月,当其他人修改代码时却没有正确理解它(因为他没有阅读文档?)它会在没有人注意的情况下破坏,或者随机开始崩溃.

所以,我提出的解决方案是简单的结构

struct blob { char *ptr; size_t len; }
Run Code Online (Sandbox Code Playgroud)

这些例子可以像这样重写:

void examine_data(const struct blob data)
{
    ... use data.tr and data.len ...
}

struct blob = { .ptr = ..., .len = ... };
examine_data(blob); …
Run Code Online (Sandbox Code Playgroud)

c struct parameter-passing abi

153
推荐指数
9
解决办法
7万
查看次数

从C中的函数返回`struct`

今天我教了几个朋友如何使用C structs.其中一个问你是否可以struct从一个函数返回一个函数,我回答说:"不!你会返回指向动态malloc编辑struct的指针."

来自主要使用C++的人,我期望无法struct按值返回s.在C++中,您可以operator =为对象重载并完全理解为具有按值返回对象的函数.但是,在C中,你没有那个选项,所以它让我思考编译器实际上在做什么.考虑以下:

struct MyObj{
    double x, y;
};

struct MyObj foo(){
    struct MyObj a;

    a.x = 10;
    a.y = 10;

    return a;
}        

int main () {

    struct MyObj a;

    a = foo();    // This DOES work
    struct b = a; // This does not work

    return 0;
}    
Run Code Online (Sandbox Code Playgroud)

我理解为什么struct b = a;不能工作 - 你不能operator =为你的数据类型重载.它是如何a = foo();编译罚款?这是否意味着什么struct b = …

c

153
推荐指数
6
解决办法
25万
查看次数

153
推荐指数
5
解决办法
29万
查看次数

~x + ~y ==〜(x + y)总是假的?

此代码是否总是评估为false?这两个变量都是两个补码签名的整数.

~x + ~y == ~(x + y)
Run Code Online (Sandbox Code Playgroud)

我觉得应该有一些数字满足条件.我试过测试之间的数字-5000,5000但从未达到平等.有没有办法建立一个方程来找到条件的解?

将一个换成另一个导致我的程序中的一个阴险的错误?

c signed bit-manipulation twos-complement

153
推荐指数
9
解决办法
8123
查看次数

在C中,大括号是否作为堆栈框架?

如果我在一组新的花括号中创建一个变量,那个变量是从结束括号上的堆栈中弹出的,还是会挂起直到函数结束?例如:

void foo() {
   int c[100];
   {
       int d[200];
   }
   //code that takes a while
   return;
}
Run Code Online (Sandbox Code Playgroud)

会不会d是在占用内存code that takes a while部分?

c memory stack

152
推荐指数
4
解决办法
9357
查看次数

__FILE__宏显示完整路径

C中可用的标准预定义MACRO __FILE__显示文件的完整路径.有没有办法缩短路径?我的意思是代替

/full/path/to/file.c
Run Code Online (Sandbox Code Playgroud)

我知道了

to/file.c
Run Code Online (Sandbox Code Playgroud)

要么

file.c
Run Code Online (Sandbox Code Playgroud)

c macros file path

152
推荐指数
14
解决办法
12万
查看次数

为什么这本书说我必须施放malloc?

今天我到了The C Programming Language(第二版Brian W. Kernighan和Dennis M. Ritchie)的167页,发现作者说我必须演员.这是本书的一部分:malloc

7.8.5存储管理

函数malloc和calloc动态获取内存块.

void *malloc(size_t n)
Run Code Online (Sandbox Code Playgroud)

返回指向未初始化存储的n个字节的指针,如果无法满足请求,则返回NULL.

void *calloc(size_t n, size_t size)
Run Code Online (Sandbox Code Playgroud)

为具有指定大小的n个对象的数组返回指向足够可用空间的指针,如果无法满足请求,则返回NULL.存储初始化为零.malloc或calloc返回的指针对于有问题的对象具有正确的对齐方式,但必须将其强制转换为适当的类型,如

int *ip;
ip = (int *) calloc(n, sizeof(int));
Run Code Online (Sandbox Code Playgroud)

我已经知道malloc(和它的族)返回类型void*,并且有很好的解释为什么不进行转换malloc.

但我的问题是:为什么这本书说我应该施展它?

c malloc casting kernighan-and-ritchie

152
推荐指数
1
解决办法
1万
查看次数