Tag: 编码风格的

glib是否能以一种不引人注目的方式使用?

我正在为标准C库之上的C寻找一个好的通用库,并且已经看到了一些使用glib的建议。 你的代码中有多么“突兀”? 为了解释我所说的突兀是什么意思,我在参考手册中注意到的第一件事是基本类型部分 ,对自己思考,“我将开始使用gint , gchar和gprefixing geverything gin gmy gcode gnow?” 更一般地说,您是否可以仅在本地使用它而不需要在代码中使用其他function或文件来了解其用途? 它是否强制对代码进行某些假设,或者对编译/链接过程施加约束? 它是否在运行时为全局数据结构占用了大量内存? 等等

关于范围的变量的最佳声明

我问这个问题主要是关于C编程,但欢迎任何语言的见解。 说到C,我知道它只允许变量声明在代码块的最开始发生。 我一直认为应该在函数的最开始声明要在函数内使用的所有变量。 但是在很多情况下我会有一个仅在循环(或类似的块)中使用的变量。 一个例子是一些返回值的临时变量: while ( whatever ) { int ret; ret = getSomeValue(); } 或者某些州可能需要举行的地方: while ( whatever ) { static int count=0; count++; } 我想知道它是否被认为是不合适的,或者,如果在控制流程块中声明变量有任何负面影响,例如if-else,for循环,while循环等。 变量是否应始终以最严格的范围声明? 静态声明怎么样? 编辑 :好的,我可能应该说我知道C99在你声明变量的地方更自由,但是从我看到的很多C代码中,它们仍然通常被声明在顶部。 另外,我使用的VS2K8仍然抱怨声明。 另外,看到我已经有2票可以关闭这个thead,我会明确表示我更关注性能和编译器方面,而不是任何风格。

C样式/ C ++的正确性,是struct / union / enum标签与类型名称相同吗?

以下MyStruct(标记MyStruct)的定义和MyStruct类型的类型定义似乎完全可以通过gcc(至少4.6.2)和g ++来完成。 typedef struct MyStruct { int a; int b; } MyStruct; 我的问题是:它是否容易出错(在C和/或C ++中)或使用标签名称与类型名称相同的错误样式? 根据http://www.eetimes.com/discussion/programming-pointers/4024450/Tag-vs-Type-Names,它不是: 我永远不明白为什么他们为标签和typedef使用不同的名称时,一个名称就可以了: typedef struct tree_node tree_node; 但我经常看到代码样式如下: typedef struct tagMyStruct {…} MyStruct; typedef struct myStruct {…} MyStruct;` typedef struct _MyStruct {…} MyStruct; <是的,我知道下划线+大写字母 在每种情况下,有人在某种程度上使标签名称与类型名称不同 。 它背后有什么实际原因吗? 旁注:我使用的是C ++编译器,但我想与这些定义C兼容(我知道这对c ++来说是不好的风格)。 出于维护某些调试工具的可用性的原因,我需要所有标记名称都是有意义的(不是自动生成的__unknown_something标记,如果是未命名的结构,您可以,例如,在visual studio类视图中查看)。 同样的问题/问题适用于工会和枚举。

在字符串文字中使用制表符是“不好的做法”吗?

作为后续内容是否必须在C和C ++中转义制表符? (注意我不是上述问题的作者)。 我已经知道这样的代码被认为是“不好的做法”。 这些评论似乎暗示了同样的事情。 但是,由于某些原因,该标准允许这种欺骗,所以有人必须要么没有发现它的伤害或有一个用例。 是不是逃避制表字符被广泛接受为“不良做法”?

GOTO认为是无害的

在几个SO讨论中已经对goto声明进行了长时间的讨论(见此和那个 ),我当然不想重振那些激烈的争论。 相反,我想集中讨论goto的一个用例并讨论它的价值和可能的替代方案。 考虑以下代码片段,这在(至少我自己的)FSM中很常见: while (state = next_state()) { switch (state) { case foo: /* handle foo, and finally: */ if (error) goto cleanup; break; case bar: /* handle bar, and finally: */ if (error) goto cleanup; break; /* …other cases… */ } } return ok; cleanup: /* do some cleanup, ie free() local heap […]