c - 在 C 中不使用对象进行管理 - 而且,为什么我可以在 C 中的函数中的任何位置声明变量?

标签 c oop variables

大家。我实际上有两个问题,有些相关。

问题 #1:为什么 gcc 让我在 action 语句之后声明变量?我认为 C89 标准不允许这样做。 (GCC 版本:4.4.3)甚至当我在编译行上显式使用 --std=c89 时也会发生这种情况。我知道大多数编译器实现了非标准的东西,即 C 编译器允许 // 注释,而标准没有指定。我只想学习标准,这样如果我需要使用只是标准,我就不会遇到这样的事情。

问题 #2:在 C 语言中没有对象的情况下如何应对?我编程是一种爱好,我还没有使用过没有对象的语言(又名 OO 概念?)——我已经了解一些 C++,并且我想学习如何单独使用 C。据推测,一种方法是制作一个 POD 结构并制作类似于 StructName_constructor()StructName_doSomething() 等的函数,并将结构实例传递给每个函数 - 是这个“正确”的方式,还是我完全离开了?

编辑:由于一些小的混淆,我更清楚地定义了我的第二个问题:我不是在问 How do I use Objects in C? 我是在问 How do you在 C 中不使用对象进行管理?,也就是在通常使用对象的情况下,如何在没有对象的情况下完成任务?

提前,非常感谢。我从来没有使用过没有 OOP 的语言! :)

编辑:根据要求,这里是变量声明问题的示例:

/* includes, or whatever */
int main(int argc, char *argv[]) {
    int  myInt = 5;
    printf("myInt is %d\n", myInt);
    int test = 4; /* This does not result in a compile error */
    printf("Test is %d\n", test);
    return 0;
}

最佳答案

  1. c89 不允许这样做,但 c99 允许。尽管花了很长时间才流行起来,但一些编译器(包括 gcc)终于开始实现 c99 功能。
  2. IMO,如果您想使用 OOP,您可能应该坚持使用 C++ 或尝试使用 Objective C。再次尝试重新发明构建在 C 之上的 OOP 没有多大意义。

如果您无论如何都坚持这样做,是的,您可以传递一个指向结构的指针作为 this 的模仿——但这仍然不是一个好主意。

当您需要对数据结构进行操作时,传递(指向)结构通常是有意义的。但是,我不建议非常努力地将函数组合在一起并让它们都将指向结构的指针作为它们的第一个参数,只是因为其他语言碰巧就是这样实现的。

如果您碰巧有许多函数都在特定结构上运行/与特定结构一起运行,并且它们都接收指向该结构的指针作为它们的第一个参数确实有意义,那很好——但不要这样做觉得有必要强制执行它只是因为 C++ 碰巧以这种方式做事。

编辑:至于你如何在没有对象的情况下进行管理:好吧,至少在我编写 C 语言时,我倾向于更频繁地对单个字符进行操作。对于它的值(value),在 C++ 中,我通常会得到几行相对较长的代码;在 C 中,我倾向于使用很多短行。

代码和数据之间有更多的分离,但在某种程度上它们仍然是耦合的——二叉树(例如)仍然需要代码来插入节点、删除节点、遍历树等。同样,这些操作的代码需要了解结构的布局以及指针的名称等。

就个人而言,我更倾向于在我的 C 代码中使用通用命名约定,因此(举几个例子)二叉树中指向子树的指针总是只命名为 left对了。如果我使用链表(很少见),指向下一个节点的指针总是命名为 next(如果它是双向链接的,另一个是 prev)。这对编写代码有很大帮助,而不必花费大量时间查找结构定义来弄清楚我这次对某些东西使用的名称。

关于c - 在 C 中不使用对象进行管理 - 而且,为什么我可以在 C 中的函数中的任何位置声明变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5966301/

相关文章:

oop - 在 R 中使用 sd 作为通用函数

Ruby 嵌套模块作为命名空间

variables - 如何设置 LIBRARY_PATH?

variables - 如何使用参数或变量值作为节点名称?

c - 列出数组中不重复的字符

c - 我在 c 中使用 pow 和 sqrt 函数有问题吗?

c - 将有符号整数除以 2 的幂

c - 时间结构 : negative delay with libpcap

java - Java 双重哈希问题

java - 我应该使用 static 还是 getters/setters?