c++ - 没有类的对象 - 'clean C' 中的数据模型

标签 c++ c c++11 procedural-programming

<分区>

我曾在一些中型项目中使用 C++,但我从未用 C 进行过任何正式的编程。

已阅读this article我开始想知道如何在没有类和异常的情况下使用 C++11。我曾经听说过 clean C 这个词。 Clean C 应该是 C++ 代码,它不使用 ANSI C 没有的 C++ 功能,例如类或元编程。

关于如何在 C 语言中有效地做事以及如何在 C++ 中做事,有很多资源。但令人惊讶的是,很难找到任何关于如何兼顾两全其美的资源。

我的问题分为两部分:

  1. 是否有关于在没有命名空间、异常和元编程的情况下使用 C++ 的任何好的资源?书籍、开源项目?
  2. 请查看这段简单的代码,这是我第一次尝试处理上述 C++11 子集中的数据结构和 char 字符串。我首先想到的是代码冗余。你会做哪些不同的事情?为什么?

-

#include <cstring>

namespace addressbook {
namespace contact {

struct contact {
    char* name;
    char* email;
};

void initialize(addressbook::contact::contact* contact)
{
    contact->name = nullptr;
    contact->email = nullptr;
}

void deinitialize(addressbook::contact::contact* contact)
{
    delete[] contact->name;
    delete[] contact->email;
}

void set_name(addressbook::contact::contact* contact, char* name)
{
    delete[] contact->name;
    contact->name = new char [strlen(name) + 1];
    std::strcpy(contact->name, name);
}

void set_email(addressbook::contact::contact* contact, char* email)
{
    delete[] contact->email;
    contact->email = new char [strlen(email) + 1];
    std::strcpy(contact->email, email);
}

} // namespace contact
} // namespace addressbook

int main()
{
    namespace c = addressbook::contact;

    c::contact jimmy;

    c::initialize(&jimmy);

    c::set_name(&jimmy, const_cast<char*>("Jimmy Page"));
    c::set_email(&jimmy, const_cast<char*>("jp@example.com"));

    c::deinitialize(&jimmy);

    return 0;
}

请怜悯我 - 我是结构编程新手。

那为什么不只是 C?

命名空间、新建/删除、标准库算法、boost 库、C++11 很酷的特性 - 仅举几例。

为什么在没有构造函数/析构函数的情况下新建/删除?

因为类型安全。 malloc 返回 *void

但是标准库会抛出异常! boost 也是如此!

我没有使用异常并不意味着我无法处理来自外部库的异常。这只是意味着我想在系统的我的部分中以不同的方式管理问题。

最佳答案

But it's surprisingly hard to find any resources on how to take the best of both worlds.

因为没有。做这样的事情的唯一原因是因为你迫切需要兼容性——例如,Lua 是用“干净的 C”编写的。根本没有什么“最好”的。

这只是伪装成糟糕的 C++ 代码的 C 代码。它不是 C++ 代码,但兼容。 “干净的 C”没有什么比普通 C 更好的了。

编辑:提问者先生,您似乎根本不知道 WTF“干净的 C”,甚至。它使您的源代码,甚至是实现,编译为 C++ 的 C 代码。没有命名空间,没有类型,没有常量,什么都没有。 C++-with-a-C-interface 是完全不同的东西,与干净的 C 完全无关。在这种情况下,没有理由限制您在实现中使用的 C++ 功能。

关于c++ - 没有类的对象 - 'clean C' 中的数据模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10537176/

相关文章:

c++ - Tensorflow 从 C++ 中的 Graph Def 获取形状

c++ - 如何使用 PathCreateFromUrlA API

C++:混沌游戏:金字塔对齐点要正确绘制

c - 为什么c程序的输出是40?

c++ - 哪些类型的代码需要注意右值引用?

c++ - 在 C++ 字符串中编写单个选项卡时打印双选项卡

c - 如何找到 sizeof 数组?

c - 使用 printf 打印字符串的两种方法

C++ 11成员初始化器列表与类内初始化器?

c++ - 在 C++11 中迭代生成一组线程?