Mik*_*rek 4 c c++ procedural-programming c++11
我在一些中型项目上使用过C++,但我从来没有在C中做过任何严肃的编程.
阅读完本文后,我开始想知道如何在没有类和异常的情况下使用C++ 11.我曾经听过干净的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;
}
Run Code Online (Sandbox Code Playgroud)
请怜悯我 - 我是一个结构编程新手.
为什么不只是C呢?
命名空间,新/删除,标准库算法,增强库,C++ 11很酷的功能 - 仅举几例.
为什么在没有构造函数/析构函数时使用new/delete?
因为类型安全.malloc回报*void
但标准库抛出异常!并且提升也是如此!
我没有使用异常的事实并不意味着我无法处理来自外部库的异常.这只是意味着我要在不同的管理问题,我的部分系统.
Pup*_*ppy 10
但是很难找到任何有关如何充分利用这两个方面的资源.
因为没有一个.做这种事情的唯一原因是因为你非常渴望兼容性 - 例如,Lua是用"干净的C"编写的.根本没有什么"最好的".
这只是C代码假装是可怕的C++代码.它不是C++代码,而是兼容的.关于"干净的C"没有比普通的C更好的了.
编辑:你,先生提问者,似乎不知道WTF"干净的C"甚至是.它正在制作你的源代码,甚至是实现,编译为C++的C代码.没有名称空间,没有类型,没有常量,没有任何东西.C++ - with-aC-interface是一个完全不同的东西,与清理C完全无关.在这种情况下,没有理由限制你在实现中使用哪些C++特性.
首先要注意的是,即使我们接受文章的前提,也没有理由不使用类.也许不使用构造函数,赋值等. - 但是没有理由不使用成员函数.
接下来,不要陷入在整个地方使用指针的陷阱.在可能的情况下,您仍然应该更喜欢值语义.如果你必须使用指针,使用智能指针而不是手动内存管理,并注意甚至new可以抛出异常(除非你使用std::nothrow重载).
最后,不要避免使用C++标准库函数来支持C函数.例如,不要使用strcpy- use std::copy和其他C++算法.
另外,不需要检查nullptr之前的检查delete[].
| 归档时间: |
|
| 查看次数: |
3380 次 |
| 最近记录: |