我在一些中型项目上使用C ++,但我从来没有在C中进行过任何严肃的编程。
阅读this article我开始想知道如何在没有类和异常的情况下使用C ++ 11。我曾经听说过 clean C 这个词。 Clean C 应该是一个C ++代码,它不使用ANSI C没有的C ++特性,比如类或元编程。
有很多资源如何有效地在C中做事,以及如何在C ++中做到这一点。但是,很难找到任何有关如何充分利用这两个方面的资源。
我的问题分为两部分:
-
#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呢?
命名空间,新/删除,标准库算法,增强库,C ++ 11很酷的功能 - 仅举几例。
为什么在没有构造函数/析构函数时使用new / delete?
因为类型安全。 malloc
返回*void
但标准库会抛出异常!而且也会提升!
我没有使用异常的事实并不意味着我无法处理来自外部库的异常。这只是意味着我想在系统的我的部分中以不同方式管理问题。
答案 0 :(得分:11)
但是很难找到任何关于如何获取资源的资源 两全其美。
因为没有一个。做这种事情的唯一原因是因为你非常渴望兼容性 - 例如,Lua是用“干净的C”编写的。根本没有什么“最好的”。
这只是C代码假装是可怕的C ++代码。它不是C ++代码,而是兼容的。 “普通C”没有什么比“普通C”更好的了。
编辑:你,先生提问者,似乎不知道WTF“干净的C”,甚至是。它正在制作你的源代码,甚至是实现,编译为C ++的C代码。没有名称空间,没有类型,没有常量,没有任何东西。 C ++ - with-a-C-interface是一个完全不同的东西,与清理C完全无关。在这种情况下,没有理由限制你在实现中使用哪些C ++特性。
答案 1 :(得分:8)
首先要注意的是,即使我们接受文章的前提,也有没有的理由不使用类。也许不使用构造函数,赋值等。 - 但是没有理由不使用成员函数,例如。
接下来,不要陷入在整个地方使用指针的陷阱。您应该仍然更喜欢值语义。如果必须使用指针,请使用 smart 指针而不是手动内存管理,并注意即使new
也会抛出异常(除非您使用std::nothrow
重载)。< / p>
最后,不要避免使用C ++标准库函数来支持C函数。例如,不要使用strcpy
- 使用std::copy
和其他C ++算法。
另外,在nullptr
之前检查delete[]
是不必要的。