为什么不用C++写游戏

当今世界上绝大多数游戏都是C++写的,为什么要说不呢?

要做什么?写游戏。


写游戏首先要考虑些什么?做什么样的游戏,图形、音效、游戏逻辑如何实现。


用C++要先考虑什么?定义跨平台数据类型抽象,实现常用集合类,设计宏实现RTTI,写一个支持Unicode并可以和其他多种字符串类型互相转换的字符串类,自定义内存分配器,写个shared_ptr,组织预编译头文件,设计实现Object基类以处理跨DLL内存管理等问题……


那么这些和做游戏有什么关系?不做好这些就很难开始写游戏。


做这些要话多少时间?很多时间。

就是这个原因了,得花很多时间用来关心解决语言本身的不足,而不是要做的游戏本身。尤其是人们多有完美主义倾向,这些基本问题每个都可以发掘出更深层次的问题,进行更进一步的优化,进一步耗费宝贵的时间。这也可以解释为什么有那么多的引擎、引擎基础存在,因为时间都花在底层上了。

新技术出现的快,游戏架构更新的也快,补丁摞补丁是游戏行业的常事,补不了了就得换新的,哪管你是不是用神圣的C++写的。游戏开发人员属于消耗品,所以想开一点,人生苦短,及时行乐。有句话叫“Good managers don't torture their programmers with bad tools”,同理,聪明的程序员不用C++折磨自己。非得用的话,也尽量找个现成的类库,除非是要专研底层技术。

Qt **不能用纯C语言编**,它是一个**基于C++的框架**,并且重度依赖C++的特性(如类、对象、继承、信号与槽机制等),因此你**无法使用纯C语言来开发Qt应用程序**。 ### 为什么不能用CQt程序? Qt 的核心设计基于以下 C++ 特性: - **面向对象编程(OOP)**:Qt 中几乎所有组件(如 `QWidget`、`QApplication`、`QPushButton`)都是 C++ 类。 - **信号与槽(Signals and Slots)**:这是 Qt 的核心通信机制,依赖于 C++ 的元对象系统(Meta-Object System),由 `moc`(Meta-Object Compiler)处理,这在 C 中无法实现。 - **模板和 STL 支持**:Qt 大量使用模板(如 `QList<T>`、`QMap<K,V>`)。 - **构造函数/析构函数、运算符重载、虚函数**等 C++ 特性。 --- ### 示例:一个最简单的 Qt 程序(C++) ```cpp #include <QApplication> #include <QWidget> int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget window; window.setWindowTitle("Hello, Qt!"); window.resize(300, 200); window.show(); return app.exec(); } ``` 这段代码中: - `QApplication` 是 C++ 类,管理应用的生命周期。 - `QWidget` 是窗口基类。 - `app.exec()` 启动事件循环。 - 所有这些都依赖 C++ 运行时和 Qt 的元对象系统。 --- ### 是否可以在 Qt 中调用 C 代码? ✅ **可以!** 虽然 Qt 本身必须用 C++ ,但你可以在 Qt 项目中**混合使用 C 和 C++**(即使用 `.c` 和 `.cpp` 文件共存)。 #### 示例:在 Qt 项目中调用 C 函数 **hello.h**(C 风格头文件) ```c #ifndef HELLO_H #define HELLO_H #ifdef __cplusplus extern "C" { #endif void say_hello(); #ifdef __cplusplus } #endif #endif // HELLO_H ``` **hello.c** ```c #include <stdio.h> void say_hello() { printf("Hello from C!\n"); } ``` **在 main.cpp 中调用** ```cpp #include <QApplication> #include <QWidget> #include <QDebug> extern "C" void say_hello(); // 声明 C 函数 int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget window; window.setWindowTitle("Calling C from Qt"); window.show(); say_hello(); // 调用 C 函数 qDebug() << "Called from Qt"; return app.exec(); } ``` #### 在 `.pro` 文件中添加 C 源文件 ```qmake SOURCES += main.cpp \ hello.c HEADERS += hello.h ``` 这样就可以在 Qt(C++)项目中安全地调用 C 代码。 --- ### 替代方案:如果想用 C 开发 GUI 应用 如果你坚持使用 **C 语言开发 GUI**,可以考虑以下替代框架: | 框架 | 特点 | |------|------| | **GTK** | 原生支持 C,跨平台,Linux 上广泛使用 | | **IUP** | 轻量级,专为 C 设计,简单易用 | | **NanoGUI (C binding)** | 小型 GUI 库 | | **Allegro / SDL2** | 更偏向游戏/多媒体,但可用作 GUI 基础 | 例如,使用 GTK in C: ```c #include <gtk/gtk.h> int main(int argc, char *argv[]) { gtk_init(&argc, &argv); GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "Hello C+GTK"); gtk_window_set_default_size(GTK_WINDOW(window), 300, 200); g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL); gtk_widget_show_all(window); gtk_main(); return 0; } ``` --- ### 总结 - ❌ **不能用纯 C Qt 程序**,因为 Qt 是 C++ 框架。 - ✅ **可以在 Qt 项目中调用 C 代码**,通过 `extern "C"` 实现混合编程。 - ✅ 如果必须用 C GUI,推荐使用 **GTK** 或 **IUP** 等原生 C 框架。 ---
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值