小编Ste*_*hen的帖子

什么是自我记录代码,是否可以替换记录良好的代码?

我有一位同事坚持认为他的代码不需要评论,而是"自我记录".

我已经回顾了他的代码,虽然它比我见过其他代码生成的代码更清晰,但我仍然不同意自我编写代码是完整和有用的以及评论和记录的代码.

帮助我理解的观点.

  • 什么是自我记录代码
  • 它真的可以取代评论和记录良好的代码
  • 是否存在比记录良好和注释的代码更好的情况
  • 是否存在代码无法在没有注释的情况下进行自我记录的示例

也许这只是我自己的局限,但我不知道它是如何成为一种好的做法.

这并不是一个争论 - 请不要提出为什么评论和记录良好的代码是高优先级的原因 - 有很多资源显示这一点,但它们并不能让我的同行相信.我相信我需要更充分地理解他的观点来说服他.如果必须,请开始一个新问题,但不要在此争论.

哇,快速反应!请阅读所有现有答案,并为答案提供评论,而不是添加新答案,除非您的答案与此处的其他答案完全不同.

此外,那些反对自我记录代码的人 - 这主要是为了帮助我理解自我记录代码福音传道者的观点(即积极方面).如果你不留下话题,我希望别人会贬低你.

documentation comments

252
推荐指数
19
解决办法
6万
查看次数

如何以标准方式修剪前导/尾随空格?

是否有一个干净的,最好是标准的方法来修剪C中字符串的前导和尾随空格?我会自己动手,但我认为这是一个同样常见的解决方案的常见问题.

c string whitespace trim

168
推荐指数
6
解决办法
31万
查看次数

我应该如何在C中构建复杂的项目?

我只有初学者级别的C技能,并想知道是否有任何事实上的"标准"来构建C中有点复杂的应用程序.甚至基于GUI的应用程序.

我一直在Java和PHP中使用OO范例,现在我想学习C我害怕我可能以错误的方式构建我的应用程序.我无法遵循哪些指导方针,使用程序语言实现模块化,解耦和干燥.

你有任何建议吗?我找不到C的任何应用程序框架,即使我不使用框架,我总是通过浏览他们的代码找到好的想法.

c project-management

78
推荐指数
5
解决办法
4万
查看次数

如何在c文件之间共享全局变量?

如果我在.c文件中定义一个全局变量,我如何在另一个.c文件中使用相同变量的值?

在file1.c

#include<stdio.h>

int i=10;

int main()
{
printf("%d",i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)

file2.c中

#include<stdio.h>

int main()
{
//some data regarding i
printf("%d",i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)

第二个文件如何使用i此处第一个文件的值.

c extern

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

这是未定义的C行为吗?

我们班的C编程教授问了这个问题:

你得到的代码:

int x=1;
printf("%d",++x,x+1);
Run Code Online (Sandbox Code Playgroud)

它总会产生什么输出?

大多数学生说未定义的行为.任何人都可以帮助我理解为什么会这样吗?

感谢编辑和答案,但我仍然感到困惑.

c undefined-behavior

35
推荐指数
4
解决办法
1559
查看次数

如何在Python中对压缩列表进行排序?

什么是Pythonic排序压缩列表的方法?

代码:

names = list('datx')
vals  = reversed(list(xrange(len(names))))
zipped = zip(names, vals)

print zipped
Run Code Online (Sandbox Code Playgroud)

上面的代码打印[('d',3),('a',2),('t',1),('x',0)]

我想按值排序压缩.理想情况下,它最终会看起来像[('x',0),('t',1),('a',2),('d',3)].

python sorting zip list

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

什么是滚动重启应用程序?

我想了解什么叫做滚动重启应用程序?是应用程序在群集中运行,我们开始逐个打开机器?或者这与JVM相关联?

java-ee

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

代码是"while(条件);" 有效,这是什么意思?

我们可以像while(condition);C编程一样放分号吗?如果while(condition);有效,这是什么意思?

c while-loop

26
推荐指数
6
解决办法
2万
查看次数

Microsoft面试问题中此功能有哪些错误?

我在MS写的访谈中被问到这个问题:

在下面的程序中查找错误,该错误应该返回一个\n附加到其上的新字符串.

char* AddnewlinetoString(char *s)
{
  char buffer[1024];
  strcpy(buffer,s);
  buffer[strlen(s)-1] = '\n';
  return buffer;
}
Run Code Online (Sandbox Code Playgroud)

我试图对自己进行编码,并且能够通过使缓冲区变量全局和具有来实现它buffer[strlen(s)] = '\n'.但不知道还有很多其他的错误.

c string

25
推荐指数
4
解决办法
4091
查看次数

初始化非常大的结构的正确方法是什么?

在我们的代码中,我们曾经有类似这样的东西:

   *(controller->bigstruct) = ( struct bigstruct ){ 0 };
Run Code Online (Sandbox Code Playgroud)

这曾经很好用,然后我们升级了GCC版本并突然开始看到堆栈溢出.看看程序集,旧的GCC代码(2.x)基本上是这样做的:

memset(controller->bigstruct, 0, sizeof(struct bigstruct));
Run Code Online (Sandbox Code Playgroud)

新的GCC(3.4.x)正在这样做

   struct bigstruct temp = { 0 };
   controller->bigstruct = temp;
Run Code Online (Sandbox Code Playgroud)

在审查了C99规范后,我明白了为什么; C99基本上要求堆栈上存在匿名结构.这是一个很好的概念,但是这个结构大了4兆字节,而且只能在堆上存在!

我们已经使用了我们自己的'初始化'功能来明确设置成员,但这很难看并且是一个维护问题.我不认为memset是一个合适的解决方案,因为我不知道0的位值是该类型的适当零值(我知道,但是你知道,但是你有;我不介意编译器做到了,因为它可以知道)

初始化像这样的大型结构的"正确"或至少是最好的方法是什么?

为了进一步阐明我认为memset不是解决方案的原因:未明确初始化的成员的初始化规则与静态初始化相同,如下: - 如果它有指针类型,则初始化为空指针; - 如果它有算术类型,则初始化为(正或无符号)零; ...

'memset'会将内存设置为位模式为零,这不一定是一回事.想象一下不使用IEEE浮点数的系统.不寻常,但由C支持.0.0的表示不一定意味着"全位零",它可以是处理器方便的任何东西.

c struct

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