C有课程吗?

Posted

技术标签:

【中文标题】C有课程吗?【英文标题】:Does C have classes? 【发布时间】:2021-08-14 15:58:05 【问题描述】:

好吧,你可以叫我菜鸟,但我真的很困惑。

我的前同学付钱让我用 C 编写一个程序。她给了我任务,上面写着“废话少说至少做两门课,至少写一个构造函数,至少重写一个方法”,上面写着一个字一个字。

然后我告诉她“这是 C++ 而不是 C”她说“但我们正在学习 C”

我忽略了它并用 c++ 编写了程序并发送给她,因为我认为她不知道她在说什么。她说“它不适用于代码块,而 wtf 是 cout

我想问wtf? 还是有什么误会什么的?

编辑:这么多年后我又回到了这个问题,并注意到一些 *****es 花了一些时间从问题中删除 99% 的文本。好好生活吧,现在还不是 1984 年。

【问题讨论】:

见how-do-you-implement-a-class-in-c 【参考方案1】:

不,C 没有类。也就是说,有一些方法可以在 C 中模拟面向对象的编程——快速的 Google 搜索应该会产生一些有用的结果。

【讨论】:

【参考方案2】:

不,C 本身没有类,只有 C++(当时以“带类的 C”开始......)。但是您可以在 C++ 代码中使用标准 C 库,即使这通常不被认为是好的做法(其中 C++ 有自己的更高级别的构造,例如 coutprintf)。

您也可以在 C 中模拟类、继承和虚函数的行为,但这不值得。

你可能应该给你的前同学买一本 C 编程书 :-)

【讨论】:

@Nick,因为通常(尽管并非总是)C++ 有自己的、更高级别、更多的面向对象结构来解决相同的问题。【参考方案3】:

C 没有类的正式构造。您可以使用模块级数据生成模块,根据您自己的协议,您不会在其他任何地方使用这些数据或静态数据,并编写函数来获取、设置和以其他方式操作该数据。您甚至可以使用函数指针来操作类似的数据类型,就好像它们在一个类中一样。

但是,您不会受到 C 编译器的类语义或其他规则的保护,因为 C 编译器不知道类。但是,结构化数据非常强大。

【讨论】:

【参考方案4】:

C 没有类。

但是我们可以通过使用静态全局变量作为私有类成员,使用静态函数作为私有成员函数来近似一个类。外部成员为公众。在这种情况下,可以将整个文件视为一个类。

这可能不是你想要的。

【讨论】:

【参考方案5】:

一个典型的需求冲突案例,看起来:-)

她要求的术语CLASS、CONSTRUCTOR、METHOD都是C++术语,而没有一个是C术语(其中最接近的可以说是STRUCT、INITIALIZATION、FUNCTION em>)。您的朋友在这里混淆了一些东西。不过,我怀疑她的老师是否混淆了某些东西……

【讨论】:

【参考方案6】:

C 没有类,但您可以使用结构和指向函数的指针来模拟它。 C99 是一点点(只是一点点)基于 C++,所以很容易用 C 复现类。

【讨论】:

C 有很长时间的结构和函数指针,实际上可以创建类之类的东西。尽管也没有可移植的类型检查,但没有重载 atd 可变数量的函数参数。我不会说这很容易。您可以创建不可移植的类(typeof、container_of)或类的残缺实现。【参考方案7】:

C 不支持类,但我们确实有棘手的 hacky 解决方法。阅读完整的说明或直接向下滚动到代码部分。

结构声明:

我声明了一个名为 classstruct。在里面,我放入了未初始化的function,类型为void,名称为Print 和一个参数char。 这看起来像void class.Print(char);

结构不允许内部初始化:

但是 struct 不允许内部变量的初始化。所以我们将在外面初始化它。我们创建了一个function,其类型为class,名称为Printer。它初始化 struct 并返回我们可以轻松使用的初始化结构。

调用类:

现在我们包含了帮助头和声明的变量,类型为class,名称printer1,值Printer()。在我使用printer1.Print("Hello from class function");调用班级成员并打印字符串之后

main.c

#include "helper.h"
void main()

    class printer1 = Printer();
    printer1.Print("Hello from class function");

helper.h

#include <stdio.h> //imports int printf(...);
void print(const char* text)

    printf(text);


typedef struct 

    void (*Print) (const char*);
 class;

class Printer()

    class Printer;
    Printer.Print = &print;
    return Printer;

注意:

这个确切的示例已使用 VC 和 tcc 编译器成功编译和测试。 class 是示例名称。您也可以使用任何其他名称。

【讨论】:

这向我显示了错误“预期';'在结构定义之后”、“typedef-declaration 中缺少类型”和“')' 标记之前的预期不合格 ID”,我尝试命名结构,但没有帮助,我使用的是 Dev-C++ 5.11 Dev C++ 是IDE,你用什么编译器?可能是你做错了什么。无需修改的相同代码适用于Microsoft Visual C++gnu c compilertiny c compiler【参考方案8】:

C 主要使用函数式/结构式编程,而不是像 C++、Java、Python 等使用类的语言那样实现面向对象编程。但在少数情况下,我们会使用以下类:

typedef struct 
    ShapeClass shape;
    float width, height;

RectangleClass;

希望对您有所帮助。

【讨论】:

但是如何将void 之类的函数放入struct 中? @GrayProgrammerz 理想情况下,struct 不可能帮助您处理相关数据:#include #include typedef struct string name;字符串编号; 人; int main(void) 人 [0]; people[0].name="何塞";人[0].number="+25417"; people[1].name="Mbote"; people[1].number="+254-7926-22515"; for(int i=0, n=2;i

以上是关于C有课程吗?的主要内容,如果未能解决你的问题,请参考以下文章

SQL中,查询学生姓名及所选修的课程名和成绩

SQL的嵌套问题

嵌入式开发培训有哪些内容?

CTF新人如何入门?在校大学生一年级,在CTF社团听老师推荐连天教育的课程不错,有必要报名学CTF吗?

百度云课程 百万年薪C C++程序员课程 网课资源大全

这是我应该创建课程的时候吗?