• 关于

    library c++

    的搜索结果

回答

按照从入门到提升的过程,我给您拟了一个学习计划。循序渐进学习C/C++ 0_0 易学C++ 1_0 C程序设计 1_0 C程序设计(谭浩强)或者1_1 C++程序设计教程 (钱能第二版) 1_1 Essential C++ 1_2 C++ Primer3 1_20 C++ Primer Plus中文版第5版 1_21 c++大学教程(第二版) 1_22 C++程序设计语言 1_23 C++沉思录 2_1 Effective C++ 2_2 Exceptional C++ 2_3 More Effective C++ 2_4 More Exceptional 3_1 Inside the C++ Object Model 3_1 Inside the C++ Object Model 3_1 Inside.The.C++.Object.Model 3_2 The Design And Evolution Of C++ 4_1 The C++ Standard Library 4_2 Effective STL 4_3 Generic Programming and the STL 4_4 STL 源码剖析 5_1 Exceptional C++ Style 5_2 C++Template 5_3 modern c++ design 5_4 C++面向对象多线程编程 这是我个人学习C的过程(C/C++)相关的资料和文档我这都有。如果你需要可以找我要。 另外提一点建议,因为学习一门计算机语言是件辛苦的事,你要下定决心就一定要坚持,千万不能开始兴趣浓厚,过了几天遇到一些困难就又打打鱼晒晒网,那就不好了。-------------------------问了这个问题,那么可以假设K&R已经看过了吧。 自己看过的所谓的“第二本”C语言的书(虽然书架上这方面的书有不少): 《C专家编程》和《C陷阱和缺陷》。 个人力荐《C专家编程》,没看这本书之前还是挺自以为是的,看了之后才发现 原来远没有那么“透彻”的理解过。书中的讲数组和指针什么时候相同和什么时候 不同的两节让我深深折服---太漂亮了。当然其他的很多知识点也是很值得一看的,且每章 后面还带了有意思的话题,书的最后还有些哲学性的话和一些面试、笔试题。绝对物有所值的 一本书。另外,这本书不厚的,记得当时是拿起来就没有放下,一气看完的,吸引人呀。 《C陷阱和缺陷》,说实在话,我没有从这本书学到太多的东西,书中所得很多注意事项大部分 都在别的地方看见过。当然这本书也可以看看,毕竟很薄,才一百多页。 其他的书,自己也没有看过,就还是不要说了吧。 斯坦福有一门课叫《编程范式》(programming paradigm),自己在跟,挺好的,尤其是练习 ,有时间可以学学。
沉默术士 2019-12-02 01:20:07 0 浏览量 回答数 0

问题

win7下mongodb c++驱动问题

win7下mongodb c++驱动问题SCRAM-SHA-1 mechanism support not compiled into client library. (Some mechanisms require the driver ...
落地花开啦 2019-12-01 20:03:19 1084 浏览量 回答数 1

问题

mongodb c++ driver异常的问题

验证用户名时,异常:SCRAM-SHA-1 mechanism support not compiled into client library. (Some mechanisms require the driver。编译mongodb3...
落地花开啦 2019-12-01 20:03:19 1229 浏览量 回答数 1

阿里云高校特惠,助力学生创业梦!0元体验,快速入门云计算!

建个炫酷的简历网页,制作一个浪漫的表白网页,打造个人专属网盘,多种动手场景应用免费学!!!

回答

动态链接库找不到,题主需要提供更多信息哈。提供一个可能的思路,mac下默认的编译器为LLVM,假设使用xCode,可以在设置中更改为gnu。比如:"Build Settings"--> Apple LLVM compiler 4.1 - Language > C++ Standard Library:= Change from libc++ (LLVM ...) to libstdc++ (GNU C++ ...)
caitengwei 2019-12-02 03:11:26 0 浏览量 回答数 0

回答

将Apple LLVM compiler 4.1 - Language ->c++ Standard Library 修改为 libstdc++ !
爵霸 2019-12-02 02:04:03 0 浏览量 回答数 0

回答

编译mongoclient的命令很简单:scons –-dd --32 mongoclient.lib // build C++ client driver library编译后在mongodbbuildwin3232ddclient_build生成mongoclient.lib.会不会是你的版本有问题
落地花开啦 2019-12-02 01:53:38 0 浏览量 回答数 0

回答

eclipse cdt插件,开发c/c++程序,编译时报错Program "make" not found in PATH 经查C:MinGWbin下确实无make.exe,有mingw32-make.exe,更改名字后,可以编译、运行。但是有个错误,找不到mingwg++把mingw32-g++.exe改成mingwg++设置环境变量LIBRARY_PATH=C:MinGWlib C_INCLUDE_PATH=C:MinGWinclude CPLUS_INCLUDE_PATH=C:MinGWinclude
爵霸 2019-12-02 02:54:05 0 浏览量 回答数 0

问题

Android调用非NDK编译的静态库的问题

Android调用的静态库必须通过NDK编译吗?假如我用MinGW GCC编译了一个很简单的静态库,就一个add函数,有没有办法用NDK将其转化为Android的静态库?通过NDK编译出静态库文件再封装我已经会了,只需要用PREBUILT_...
a123456678 2019-12-01 20:28:01 907 浏览量 回答数 1

问题

关于java中JNA调用c++ dll文件失败问题?报错

关于java中JNA调用c++ dll文件失败问题 现在目前使用的是 4.0的jar和3.5.1的 两个版本都不可以。 问题描述: 我把c++写好的dll文件放到 当前项目下&...
爱吃鱼的程序员 2020-06-22 14:47:24 0 浏览量 回答数 1

问题

c++引用c函数时,报错误 error LNK2001: 无法解析的外部符号

我的c头文件是这么写的 #ifdef __cplusplus extern "C" { #endif extern int shmdb_initParent(STHashShareHandle *handle,unsigned int...
a123456678 2019-12-01 19:48:08 2683 浏览量 回答数 1

问题

c++连接mysql总是报连接错误(windows)?报错

小白一枚,倒腾c++连接mysql,总是报连接错误。 操作如下 1、安装mysql-5.6.17-winx64,vc2012 express版本 2、vc指定mysql....
爱吃鱼的程序员 2020-06-14 14:51:13 0 浏览量 回答数 1

回答

触及 multiple inheritance (MI)(多继承)的时候,C++ 社区就会鲜明地分裂为两个基本的阵营。一个阵营认为如果 single inheritance (SI)(单继承)是有好处的,multiple inheritance(多继承)一定更有好处。另一个阵营认为 single inheritance(单继承)有好处,但是多继承引起的麻烦使它得不偿失。在本文中,我们的主要目的是理解在 MI 问题上的这两种看法。   首要的事情之一是要承认当将 MI 引入设计领域时,就有可能从多于一个的 base class(基类)中继承相同的名字(例如,函数,typedef,等等)。这就为歧义性提供了新的时机。例如: class BorrowableItem { // something a library lets you borrowpublic: void checkOut(); // check the item out from the library ..}; class ElectronicGadget {private: bool checkOut() const; // perform self-test, return whether ... // test succeeds}; class MP3Player: // note MI herepublic BorrowableItem, // (some libraries loan MP3 players)public ElectronicGadget{ ... }; // class definition is unimportant MP3Player mp; mp.checkOut(); // ambiguous! which checkOut?    注意这个例子,即使两个函数中只有一个是可访问的,对 checkOut 的调用也是有歧义的。(checkOut 在 BorrowableItem 中是 public(公有)的,但在 ElectronicGadget 中是 private(私有)的。)这与 C++ 解析 overloaded functions(重载函数)调用的规则是一致的:在看到一个函数的是否可访问之前,C++ 首先确定与调用匹配最好的那个函数。只有在确定了 best-match function(最佳匹配函数)之后,才检查可访问性。这目前的情况下,两个 checkOuts 具有相同的匹配程度,所以就不存在最佳匹配。因此永远也不会检查到 ElectronicGadget::checkOut 的可访问性。   为了消除歧义性,你必须指定哪一个 base class(基类)的函数被调用: mp.BorrowableItem::checkOut(); // ah, that checkOut...   当然,你也可以尝试显式调用 ElectronicGadget::checkOut,但这样做会有一个 "you're trying to call a private member function"(你试图调用一个私有成员函数)错误代替歧义性错误。    multiple inheritance(多继承)仅仅意味着从多于一个的 base class(基类)继承,但是在还有 higher-level base classes(更高层次基类)的 hierarchies(继承体系)中出现 MI 也并不罕见。这会导致有时被称为 "deadly MI diamond"(致命的多继承菱形)的后果。 class File { ... };class InputFile: public File { ... };class OutputFile: public File { ... };class IOFile: public InputFile,public OutputFile{ ... };    在一个“在一个 base class(基类)和一个 derived class(派生类)之间有多于一条路径的 inheritance hierarchy(继承体系)”(就像上面在 File 和 IOFile 之间,有通过 InputFile 和 OutputFile 的两条路径)的任何时候,你都必须面对是否需要为每一条路径复制 base class(基类)中的 data members(数据成员)的问题。例如,假设 File class 有一个 data members(数据成员)fileName。IOFile 中应该有这个 field(字段)的多少个拷贝呢?一方面,它从它的每一个 base classes(基类)继承一个拷贝,这就暗示 IOFile 应该有两个 fileName data members(数据成员)。另一方面,简单的逻辑告诉我们一个 IOFile object(对象)应该仅有一个 file name(文件名),所以通过它的两个 base classes(基类)继承来的 fileName field(字段)不应该被复制。   C++ 在这个争议上没有自己的立场。它恰当地支持两种选项,虽然它的缺省方式是执行复制。如果那不是你想要的,你必须让这个 class(类)带有一个 virtual base class(虚拟基类)的数据(也就是 File)。为了做到这一点,你要让从它直接继承的所有的 classes(类)使用 virtual inheritance(虚拟继承): class File { ... };class InputFile: virtual public File { ... };class OutputFile: virtual public File { ... };class IOFile: public InputFile,public OutputFile{ ... };    标准 C++ 库包含一个和此类似的 MI hierarchy(继承体系),只是那个 classes(类)是 class templates(类模板),名字是 basic_ios,basic_istream,basic_ostream 和 basic_iostream,而不是 File,InputFile,OutputFile 和 IOFile。   从正确行为的观点 看,public inheritance(公有继承)应该总是 virtual(虚拟)的。如果这是唯一的观点,规则就变得简单了:你使用 public inheritance(公有继承)的任何时候,都使用 virtual public inheritance(虚拟公有继承)。唉,正确性不是唯一的视角。避免 inherited fields(继承来的字段)复制需要在编译器的一部分做一些 behind-the-scenes legerdemain(幕后的戏法),而结果是从使用 virtual inheritance(虚拟继承)的 classes(类)创建的 objects(对象)通常比不使用 virtual inheritance(虚拟继承)的要大。访问 virtual base classes(虚拟基类)中的 data members(数据成员)也比那些 non-virtual base classes(非虚拟基类)中的要慢。编译器与编译器之间有一些细节不同,但基本的要点很清楚:virtual inheritance costs(虚拟继承要付出成本)。   它也有一些其它方面的成本。支配 initialization of virtual base classes(虚拟基类初始化)的规则比 non-virtual bases(非虚拟基类)的更加复杂而且更不直观。初始化一个 virtual base(虚拟基)的职责由 hierarchy(继承体系)中 most derived class(层次最低的派生类)承担。这个规则中包括的含义:   (1) 从需要 initialization(初始化)的 virtual bases(虚拟基)派生的 classes(类)必须知道它们的 virtual bases(虚拟基),无论它距离那个 bases(基)有多远;   (2) 当一个新的 derived class(派生类)被加入继承体系时,它必须为它的 virtual bases(虚拟基)(包括直接的和间接的)承担 initialization responsibilities(初始化职责)。    我对于 virtual base classes(虚拟基类)(也就是 virtual inheritance(虚拟继承))的建议很简单。首先,除非必需,否则不要使用 virtual bases(虚拟基)。缺省情况下,使用 non-virtual inheritance(非虚拟继承)。第二,如果你必须使用 virtual base classes(虚拟基类),试着避免在其中放置数据。这样你就不必在意它的 initialization(初始化)(以及它的 turns out(清空),assignment(赋值))规则中的一些怪癖。值得一提的是 Java 和 .NET 中的 Interfaces(接口)不允许包含任何数据,它们在很多方面可以和 C++ 中的 virtual base classes(虚拟基类)相比照。   现在我们使用下面的 C++ Interface class(接口类)(参见《C++箴言:最小化文件之间的编译依赖》)来为 persons(人)建模: class IPerson {public: virtual ~IPerson();  virtual std::string name() const = 0; virtual std::string birthDate() const = 0;};    IPerson 的客户只能使用 IPerson 的 pointers(指针)和 references(引用)进行编程,因为 abstract classes(抽象类)不能被实例化。为了创建能被当作 IPerson objects(对象)使用的 objects(对象),IPerson 的客户使用 factory functions(工厂函数)(再次参见 Item 31)instantiate(实例化)从 IPerson 派生的 concrete classes(具体类): // factory function to create a Person object from a unique database ID;// see Item 18 for why the return type isn't a raw pointerstd::tr1::shared_ptr makePerson(DatabaseID personIdentifier); // function to get a database ID from the userDatabaseID askUserForDatabaseID(); DatabaseID id(askUserForDatabaseID());std::tr1::shared_ptr pp(makePerson(id)); // create an object// supporting the// IPerson interface ... // manipulate *pp via// IPerson's member// functions   但是 makePerson 怎样创建它返回的 pointers(指针)所指向的 objects(对象)呢?显然,必须有一些 makePerson 可以实例化的从 IPerson 派生的 concrete class(具体类)。    假设这个 class(类)叫做 CPerson。作为一个 concrete class(具体类),CPerson 必须提供它从 IPerson 继承来的 pure virtual functions(纯虚拟函数)的 implementations(实现)。它可以从头开始写,但利用包含大多数或全部必需品的现有组件更好一些。例如,假设一个老式的 database-specific class(老式的数据库专用类)PersonInfo 提供了 CPerson 所需要的基本要素: class PersonInfo {public: explicit PersonInfo(DatabaseID pid); virtual ~PersonInfo();  virtual const char * theName() const; virtual const char * theBirthDate() const; ... private: virtual const char * valueDelimOpen() const; // see virtual const char * valueDelimClose() const; // below ...};    你可以看出这是一个老式的 class(类),因为 member functions(成员函数)返回 const char*s 而不是 string objects(对象)。尽管如此,如果鞋子合适,为什么不穿呢?这个 class(类)的 member functions(成员函数)的名字暗示结果很可能会非常合适。   你突然发现 PersonInfo 是设计用来帮助以不同的格式打印 database fields(数据库字段)的,每一个字段的值的开始和结尾通过指定的字符串定界。缺省情况下,字段值开始和结尾定界符是方括号,所以字段值 "Ring-tailed Lemur" 很可能被安排成这种格式: [Ring-tailed Lemur]   根据方括号并非满足 PersonInfo 的全体客户的期望的事实,virtual functions(虚拟函数)valueDelimOpen 和 valueDelimClose 允许 derived classes(派生类)指定它们自己的开始和结尾定界字符串。PersonInfo 的 member functions(成员函数)的 implementations(实现)调用这些 virtual functions(虚拟函数)在它们返回的值上加上适当的定界符。作为一个例子使用 PersonInfo::theName,代码如下: const char * PersonInfo::valueDelimOpen() const{ return "["; // default opening delimiter} const char * PersonInfo::valueDelimClose() const{ return "]"; // default closing delimiter} const char * PersonInfo::theName() const{ // reserve buffer for return value; because this is // static, it's automatically initialized to all zeros static char value[Max_Formatted_Field_Value_Length];  // write opening delimiter std::strcpy(value, valueDelimOpen());  append to the string in value this object's name field (being careful to avoid buffer overruns!)  // write closing delimiter std::strcat(value, valueDelimClose());  return value;}    有人可能会质疑 PersonInfo::theName 的陈旧的设计(特别是一个 fixed-size static buffer(固定大小静态缓冲区)的使用,这样的东西发生 overrun(越界)和 threading(线程)问题是比较普遍的——参见《C++箴言:必须返回对象时别返回引用》),但是请把这样的问题放到一边而注意这里:theName 调用 valueDelimOpen 生成它要返回的 string(字符串)的开始定界符,然后它生成名字值本身,然后它调用 valueDelimClose。   因为 valueDelimOpen 和 valueDelimClose 是 virtual functions(虚拟函数),theName 返回的结果不仅依赖于 PersonInfo,也依赖于从 PersonInfo 派生的 classes(类)。    对于 CPerson 的实现者,这是好消息,因为当细读 IPerson documentation(文档)中的 fine print(晦涩的条文)时,你发现 name 和 birthDate 需要返回未经修饰的值,也就是,不允许有定界符。换句话说,如果一个人的名字叫 Homer,对那个人的 name 函数的一次调用应该返回 "Homer",而不是 "[Homer]"。   CPerson 和 PersonInfo 之间的关系是 PersonInfo 碰巧有一些函数使得 CPerson 更容易实现。这就是全部。因而它们的关系就是 is-implemented-in-terms-of,而我们知道有两种方法可以表现这一点:经由 composition(复合)(参见《C++箴言:通过composition模拟“has-a”》)和经由 private inheritance(私有继承)(参见《C++箴言:谨慎使用私有继承》)。《C++箴言:谨慎使用私有继承》 指出 composition(复合)是通常的首选方法,但如果 virtual functions(虚拟函数)要被重定义,inheritance(继承)就是必不可少的。在当前情况下,CPerson 需要重定义 valueDelimOpen 和 valueDelimClose,所以简单的 composition(复合)做不到。最直截了当的解决方案是让 CPerson 从 PersonInfo privately inherit(私有继承),虽然 《C++箴言:谨慎使用私有继承》 说过只要多做一点工作,则 CPerson 也能用 composition(复合)和 inheritance(继承)的组合有效地重定义 PersonInfo 的 virtuals(虚拟函数)。这里,我们用 private inheritance(私有继承)。   但 是 CPerson 还必须实现 IPerson interface(接口),而这被称为 public inheritance(公有继承)。这就引出一个 multiple inheritance(多继承)的合理应用:组合 public inheritance of an interface(一个接口的公有继承)和 private inheritance of an implementation(一个实现的私有继承): class IPerson { // this class specifies thepublic: // interface to be implemented virtual ~IPerson();  virtual std::string name() const = 0; virtual std::string birthDate() const = 0;}; class DatabaseID { ... }; // used below; details are// unimportant class PersonInfo { // this class has functionspublic: // useful in implementing explicit PersonInfo(DatabaseID pid); // the IPerson interface virtual ~PersonInfo();  virtual const char * theName() const; virtual const char * theBirthDate() const;  virtual const char * valueDelimOpen() const; virtual const char * valueDelimClose() const; ...}; class CPerson: public IPerson, private PersonInfo { // note use of MIpublic: explicit CPerson( DatabaseID pid): PersonInfo(pid) {} virtual std::string name() const // implementations { return PersonInfo::theName(); } // of the required // IPerson member virtual std::string birthDate() const // functions { return PersonInfo::theBirthDate(); }private: // redefinitions of const char * valueDelimOpen() const { return ""; } // inherited virtual const char * valueDelimClose() const { return ""; } // delimiter}; // functions   在 UML 中,这个设计看起来像这样:   这个例子证明 MI 既是有用的,也是可理解的。    时至今日,multiple inheritance(多继承)不过是 object-oriented toolbox(面向对象工具箱)里的又一种工具而已,典型情况下,它的使用和理解更加复杂,所以如果你得到一个或多或少等同于一个 MI 设计的 SI 设计,则 SI 设计总是更加可取。如果你能拿出来的仅有的设计包含 MI,你应该更加用心地考虑一下——总会有一些方法使得 SI 也能做到。但同时,MI 有时是最清晰的,最易于维护的,最合理的完成工作的方法。在这种情况下,毫不畏惧地使用它。只是要确保谨慎地使用它。   Things to Remember   ·multiple inheritance(多继承)比 single inheritance(单继承)更复杂。它能导致新的歧义问题和对 virtual inheritance(虚拟继承)的需要。    ·virtual inheritance(虚拟继承)增加了 size(大小)和 speed(速度)成本,以及 initialization(初始化)和 assignment(赋值)的复杂度。当 virtual base classes(虚拟基类)没有数据时它是最适用的。   ·multiple inheritance(多继承)有合理的用途。一种方案涉及组合从一个 Interface class(接口类)的 public inheritance(公有继承)和从一个有助于实现的 class(类)的 private inheritance(私有继承)。 关于虚拟继承的思考虚拟继承在一般的应用中很少用到,所以也往往被忽视,这也主要是因为在C++中,多重继承是不推荐的,而一旦离开了多重继承,虚拟继承就完全失去了存在的必要(因为这样只会降低效率和占用更多的空间,实在是一无是处)。  以下面的一个例子为例:  #include   #include   class CA  {   int k; //为了便于说明后面的内存结构特别添加  public:   void f() {cout << "CA::f" << endl;}  };  class CB : public CA  {  };  class CC : public CA  {  };  class CD : public CB, public CC  {  };  void main()  {   CD d;   d.f();  }  当编译上述代码时,我们会收到如下的错误提示:  error C2385: 'CD::f' is ambiguous  即编译器无法确定你在d.f()中要调用的函数f到底是哪一个。这里可能会让人觉得有些奇怪,命名只定义了一个CA::f,既然大家都派生自CA,那自然就是调用的CA::f,为什么还无法确定呢?  这是因为编译器在进行编译的时候,需要确定子类的函数定义,如CA::f是确定的,那么在编译CB、CC时还需要在编译器的语法树中生成CB::f,CC::f等标识,那么,在编译CD的时候,由于CB、CC都有一个函数f,此时,编译器将试图生成两个CD::f标识,显然这时就要报错了。(当我们不使用CD::f的时候,以上标识都不会生成,所以,如果去掉d.f()一句,程序将顺利通过编译)  要解决这个问题,有两个方法:  1、重载函数f():此时由于我们明确定义了CD::f,编译器检查到CD::f()调用时就无需再像上面一样去逐级生成CD::f标识了;  此时CD的元素结构如下:  --------  |CB(CA)|  |CC(CA)|  --------  故此时的sizeof(CD) = 8;(CB、CC各有一个元素k)  2、使用虚拟继承:虚拟继承又称作共享继承,这种共享其实也是编译期间实现的,当使用虚拟继承时,上面的程序将变成下面的形式:  #include   #include   class CA  {   int k;  public:   void f() {cout << "CA::f" << endl;}  };  class CB : virtual public CA  {  };  class CC : virtual public CA  {  };  class CD : public CB, public CC  {  };  void main()  {   CD d;   d.f();  }  此时,当编译器确定d.f()调用的具体含义时,将生成如下的CD结构:  ----  |CB|  |CC|  |CA|  ----  同时,在CB、CC中都分别包含了一个指向CA的vbptr(virtual base table pointer),其中记录的是从CB、CC的元素到CA的元素之间的偏移量。此时,不会生成各子类的函数f标识,除非子类重载了该函数,从而达到“共享”的目的。  也正因此,此时的sizeof(CD) = 12(两个vbptr + sizoef(int));
a123456678 2019-12-02 01:58:07 0 浏览量 回答数 0

回答

这要从两个方面来说,一个语言所形成的生态,另外一个是语言本身。从语言的生态来说一旦某个语言在一个领域建立了自己的生态系统那么它的地位几乎很难被撼动了,java 语言在大数据、云计算、企业应用方面有了无数的Library、Framework、App,以及会使用这些东西的程序员。撼动这样一个体系无异于连根拔起一颗掺天大树,更聪明的做法应该是再栽一棵树,而不是拔树。类似的情况还有 COBOL 语言在金融领域、C 语言在操作系统内核和嵌入式领域。从语言本身来说很多程序员喜欢一个语言是因为他的开发效率,语法简洁不罗嗦、坑少不容易犯错误等,或者仅仅是因为看着舒服,但是苦恼的是在特定领域不流行而自己又为这个领域工作。这也不是什么大问题,一个语言转换成另外一种语言或者编译到另外一一个语言所用的 VM 是很容易的事情。javascript 浏览器里唯一的语言坑又很多,所以有无数种语言可以转换成 javascript: List of languages that compile to JS · jashkenas/coffeescript Wiki · GitHub,jQuery 也可以认为是新的一个语言。对于 java 来说能编译到 jvm 的语言也不少, go 目前没有成熟的方案,不过未来一定会有,嵌入式领域一直是 c/c++ 的天下,但是美国的好奇号火星探测器里的 c 代码很多是用 python 生成的。
hiekay 2019-12-02 01:42:08 0 浏览量 回答数 0

回答

为了看起来更清晰,这里用一个简单点的宏来演示:`define SAFE_DELETE(p) do{ delete p; p = NULL} while(0)`假设这里去掉do...while(0),`define SAFE_DELETE(p) delete p; p = NULL;`那么以下代码:if(NULL != p) SAFE_DELETE(p)else ...do sth...就有两个问题,1) 因为if分支后有两个语句,else分支没有对应的if,编译失败2) 假设没有else, SAFE_DELETE中的第二个语句无论if测试是否通过,会永远执行。你可能发现,为了避免这两个问题,我不一定要用这个令人费解的do...while, 我直接用{}括起来就可以了`define SAFE_DELETE(p) { delete p; p = NULL;}`的确,这样的话上面的问题是不存在了,但是我想对于C++程序员来讲,在每个语句后面加分号是一种约定俗成的习惯,这样的话,以下代码:if(NULL != p) SAFE_DELETE(p);else ...do sth...其else分支就无法通过编译了(原因同上),所以采用do...while(0)是做好的选择了。也许你会说,我们代码的习惯是在每个判断后面加上{}, 就不会有这种问题了,也就不需要do...while了,如:if(...) {}else{}诚然,这是一个好的,应该提倡的编程习惯,但一般这样的宏都是作为library的一部分出现的,而对于一个library的作者,他所要做的就是让其库具有通用性,强壮性,因此他不能有任何对库的使用者的假设,如其编码规范,技术水平等。
a123456678 2019-12-02 02:15:06 0 浏览量 回答数 0

问题

C 语言连接 MySQL,使用 gcc 编译时出现链接错误:Undefined symbols for architecture x86_64

操作系统是 OS X 10.9.3 ,安装了 mysql-5.6.20-osx10.8-x86_64.dmg ,默认安装在了 mysql-5.6.20-osx10.8-x86_64 ,并且自动做了软连接: /usr/local/mysql ...
a123456678 2019-12-01 19:46:18 1686 浏览量 回答数 1

问题

求问ubuntu 13.10下ns3.8安装遇到python2.7-config意外停止

运行./build.py时,报错说“对不起,应用程序i386-linux-gnu-python2.7-config意外停止”所以就build failed,遇见错误的地方如下: Build NS-3 Entering directory `...
杨冬芳 2019-12-01 20:20:40 1600 浏览量 回答数 1

问题

基础语言百问-Python

基础语言百问-Python 软件界最近非常流行一句话“人生苦短,快用Python”,这就展示出了Python的特点,那就是快,当然这个快并不是指的Python运行快,毕竟是脚本语言,再怎样也快不过C语言和C++这样的底层语言,这里的快指的是...
薯条酱 2019-12-01 20:12:27 56807 浏览量 回答数 30

问题

PCI远程扫描漏洞补丁如何解决

您好:求助一下,一下问题如何解决 2018-08-07   Scan ID 8238876 Max CVSS 10.0 Scan State Completed Scan Compliance Status F...
1298117508539047 2019-12-01 18:51:40 2296 浏览量 回答数 0

云产品推荐

上海奇点人才服务相关的云产品 小程序定制 上海微企信息技术相关的云产品 国内短信套餐包 ECS云服务器安全配置相关的云产品 开发者问答 阿里云建站 自然场景识别相关的云产品 万网 小程序开发制作 视频内容分析 视频集锦 代理记账服务 阿里云AIoT