除了设置-Wall和设置之外-std=XXX,还有什么其他真正有用的,但是在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 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 = …
有什么区别
char* name
Run Code Online (Sandbox Code Playgroud)
它指向一个常量字符串文字,和
const char* name
Run Code Online (Sandbox Code Playgroud) 此代码是否总是评估为false?这两个变量都是两个补码签名的整数.
~x + ~y == ~(x + y)
Run Code Online (Sandbox Code Playgroud)
我觉得应该有一些数字满足条件.我试过测试之间的数字-5000,5000但从未达到平等.有没有办法建立一个方程来找到条件的解?
将一个换成另一个导致我的程序中的一个阴险的错误?
如果我在一组新的花括号中创建一个变量,那个变量是从结束括号上的堆栈中弹出的,还是会挂起直到函数结束?例如:
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中可用的标准预定义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) 今天我到了The C Programming Language(第二版Brian W. Kernighan和Dennis M. Ritchie)的第167页,发现作者说我必须演员.这是本书的一部分:malloc
7.8.5存储管理
函数malloc和calloc动态获取内存块.
Run Code Online (Sandbox Code Playgroud)void *malloc(size_t n)返回指向未初始化存储的n个字节的指针,如果无法满足请求,则返回NULL.
Run Code Online (Sandbox Code Playgroud)void *calloc(size_t n, size_t size)为具有指定大小的n个对象的数组返回指向足够可用空间的指针,如果无法满足请求,则返回NULL.存储初始化为零.malloc或calloc返回的指针对于有问题的对象具有正确的对齐方式,但必须将其强制转换为适当的类型,如
Run Code Online (Sandbox Code Playgroud)int *ip; ip = (int *) calloc(n, sizeof(int));
我已经知道malloc(和它的族)返回类型void*,并且有很好的解释为什么不进行转换malloc.
但我的问题是:为什么这本书说我应该施展它?