📄 tools.htm
字号:
<P><A NAME="dingp30"></A><A NAME="AUTO00020"></A>This approach is not as gratuitous as it might appear. <A HREF="../EC/INDEX.HTM" TARGET="_top" ONMOUSEOVER="self.status='Effective C++'; return true" ONMOUSEOUT = "self.status = self.defaultStatus"><I>Effective
C++</I></A> and <A HREF="../MEC/INDEX.HTM" TARGET="_top" ONMOUSEOVER="self.status='More Effective C++'; return true" ONMOUSEOUT = "self.status = self.defaultStatus"><I>More Effective C++</I></A> have been well-received in the
C++ programming community, and one or both form the basis for many sets
of corporate coding guidelines. In addition, at least two of the static
analysis tools in our investigation are based on these books. Finally,
by drawing our rules from well-known and easily accessible sources, we
avoided the need to explicitly justify individual rules in our benchmark
set. Instead, the justification for nearly every rule is available in
the books, and we simply refer to the appropriate book location as the
rationale for each <NOBR>rule.<SCRIPT>create_link(30);</SCRIPT>
</NOBR></P>
<P><A NAME="dingp31"></A><A NAME="AUTO00021"></A>We chose 36 rules (34 of which were drawn from <A HREF="../EC/INDEX.HTM" TARGET="_top" ONMOUSEOVER="self.status='Effective C++'; return true" ONMOUSEOUT = "self.status = self.defaultStatus"><I>Effective C++</I></A> or
<A HREF="../MEC/INDEX.HTM" TARGET="_top" ONMOUSEOVER="self.status='More Effective C++'; return true" ONMOUSEOUT = "self.status = self.defaultStatus"><I>More Effective C++</I></A>), which we divided into eight categories.
These rules are listed in Table 2. Each rule begins with its rule number,
followed by a reference to the Item number in either <A HREF="../EC/INDEX.HTM" TARGET="_top" ONMOUSEOVER="self.status='Effective C++'; return true" ONMOUSEOUT = "self.status = self.defaultStatus"><I>Effective C++</I></A>
(E) or <A HREF="../MEC/INDEX.HTM" TARGET="_top" ONMOUSEOVER="self.status='More Effective C++'; return true" ONMOUSEOUT = "self.status = self.defaultStatus"><I>More Effective C++</I></A> (M) from which it is derived. The text of the rule is often different from the text of the book Item, because the book Items tend to be worded too generally to be <NOBR>checked.<SCRIPT>create_link(31);</SCRIPT>
</NOBR></P>
<A NAME="AUTO00022"></A>
<A NAME="table2">
<TABLE WIDTH="95%" BORDER="1" CELLPADDING="3" CELLSPACING="0" ALIGN="center" BGCOLOR="#FFFFCC">
<CAPTION ALIGN="CENTER"><B>Table 2: Benchmark Rules</B></CAPTION>
<TR><TH BGCOLOR="#000000" COLSPAN="3" ALIGN="center"><FONT COLOR="#FFFFFF">General</FONT></TH></TR>
<TR><TD BGCOLOR="#FFFFCC" WIDTH="10%" ALIGN="center"><B><A NAME="rule1"><B>1</B></A></TD><TD BGCOLOR="#FFFFCC" WIDTH="10%" ALIGN="center"><SCRIPT>sendmetoo(1,1790,'E');</SCRIPT> ONMOUSEOVER = "self.status = 'E1'; return true" ONMOUSEOUT = "self.status = self.defaultStatus">E1</A></TD><TD BGCOLOR="#FFFFCC" WIDTH="80%">Use const instead of <CODE>#define</CODE> for constants at global and file scope.</TD></TR>
<TR><TD BGCOLOR="#FFFFCC" ALIGN="center"><B><A NAME="rule2"><B>2</B></A></TD><TD BGCOLOR="#FFFFCC" ALIGN="center"><SCRIPT>sendmetoo(2,77216,'M');</SCRIPT> ONMOUSEOVER = "self.status = 'M2'; return true" ONMOUSEOUT = "self.status = self.defaultStatus" >M2</A></TD><TD BGCOLOR="#FFFFCC"> Use new-style casts instead of C-style casts.
<TR><TD BGCOLOR="#FFFFCC" ALIGN="center"><A NAME="rule3"><B>3</B></A></TD><TD BGCOLOR="#FFFFCC" ALIGN="center"><SCRIPT>sendmetoo(3,84818,'M');</SCRIPT> ONMOUSEOVER = "self.status = 'M3'; return true" ONMOUSEOUT = "self.status = self.defaultStatus">M3</A></TD> <TD BGCOLOR="#FFFFCC">Don't treat a pointer to <CODE>Derived[]</CODE> as a pointer to <CODE>Base[]</CODE>.</TD></TR>
</TABLE>
<A NAME="AUTO00023"></A>
<TABLE WIDTH="95%" BORDER="1" CELLPADDING="3" CELLSPACING="0" ALIGN="center" BGCOLOR="#FFFFCC">
<TR><TD BGCOLOR="#000000" COLSPAN="3" ALIGN="center"><B><FONT COLOR="#FFFFFF">Use of new and delete</FONT></B></TD></TR>
<TR><TD BGCOLOR="#FFFFCC" ALIGN="center" WIDTH="10%"><B><A NAME="rule4">4</A></B></TD><TD BGCOLOR="#FFFFCC" ALIGN="center" WIDTH="10%"><SCRIPT>sendmetoo(5,1869,'E');</SCRIPT> ONMOUSEOVER = "self.status = 'E5'; return true" ONMOUSEOUT = "self.status = self.defaultStatus">E5</A></TD><TD BGCOLOR="#FFFFCC" WIDTH="80%"> Use the same form for calls to new and delete. (In general, this calls for dynamic analysis, but static analysis can catch some special cases, e.g., calls to new in <CODE>ctors</CODE> and to delete in <CODE>dtors</CODE>.)</TD></TR>
<TR><TD BGCOLOR="#FFFFCC" ALIGN="center"><B><A NAME="rule5">5</A></B></TD><TD BGCOLOR="#FFFFCC" ALIGN="center"><SCRIPT>sendmetoo(6,1885,'E');</SCRIPT> ONMOUSEOVER = "self.status = 'E6'; return true" ONMOUSEOUT = "self.status = self.defaultStatus">E6</A></TD><TD BGCOLOR="#FFFFCC">When the result of a new expression in a <CODE>ctor</CODE> is stored in a dumb pointer class member, make sure delete is called on that member in the <CODE>dtor</CODE>.</TD></TR>
<TR><TD BGCOLOR="#FFFFCC" ALIGN="center"><B><A NAME="rule6">6</A></B></TD><TD BGCOLOR="#FFFFCC" ALIGN="center"><SCRIPT>sendmetoo(9,1961,'E');</SCRIPT> ONMOUSEOVER = "self.status = 'E9'; return true" ONMOUSEOUT = "self.status = self.defaultStatus">E9</A> </TD><TD BGCOLOR="#FFFFCC">Avoid hiding the default signature for operator new and operator <CODE>delete</CODE>.</TD></TR>
</TABLE>
<A NAME="AUTO00024"></A>
<TABLE WIDTH="95%" BORDER="1" CELLPADDING="3" CELLSPACING="0" ALIGN="center" BGCOLOR="#FFFFCC">
<TR><TD BGCOLOR="#000000" COLSPAN="3" ALIGN="center"><B><FONT COLOR="#FFFFFF">Constructors/Destructors/Assignment</FONT></B></TD></TR>
<TR><TD BGCOLOR="#FFFFCC" ALIGN="center" WIDTH="10%"><B><A NAME="rule7a">7a</A></B></TD><TD BGCOLOR="#FFFFCC" ALIGN="center" WIDTH="10%"><SCRIPT>sendmetoo(11,2042,'E');</SCRIPT> ONMOUSEOVER = "self.status = 'E11'; return true" ONMOUSEOUT = "self.status = self.defaultStatus">E11</A></TD><TD BGCOLOR="#FFFFCC" WIDTH="80%">Declare a copy constructor for each class declaring a pointer data member.</TD></TR>
<TR><TD BGCOLOR="#FFFFCC" ALIGN="center"><B><A NAME="rule7b">7b</A></B></TD><TD BGCOLOR="#FFFFCC" ALIGN="center"> <SCRIPT>sendmetoo(11,2042,'E');</SCRIPT> ONMOUSEOVER = "self.status = 'E11'; return true" ONMOUSEOUT = "self.status = self.defaultStatus">E11</A> </TD><TD BGCOLOR="#FFFFCC"> Declare an assignment operator for each class declaring a pointer data member.</TD></TR>
<TR><TD BGCOLOR="#FFFFCC" ALIGN="center"><B><A NAME="rule8">8</A></B></TD><TD BGCOLOR="#FFFFCC" ALIGN="center"> <SCRIPT>sendmetoo(12,2071,'E');</SCRIPT> ONMOUSEOVER = "self.status = 'E12'; return true" ONMOUSEOUT = "self.status = self.defaultStatus">E12</A></TD><TD BGCOLOR="#FFFFCC"> Initialize each class data member via the member initialization list.</TD></TR>
<TR><TD BGCOLOR="#FFFFCC" ALIGN="center"><B><A NAME="rule9">9</A></B></TD><TD BGCOLOR="#FFFFCC" ALIGN="center"> <SCRIPT>sendmetoo(13,2117,'E');</SCRIPT> ONMOUSEOVER = "self.status = 'E13'; return true" ONMOUSEOUT = "self.status = self.defaultStatus">E13</A></TD><TD BGCOLOR="#FFFFCC">List members in a member initialization list in an order consistent with the order in which they are actually initialized.</TD></TR>
<TR><TD BGCOLOR="#FFFFCC" ALIGN="center"><B><A NAME="rule10">10</A></B></TD><TD BGCOLOR="#FFFFCC" ALIGN="center"> <SCRIPT>sendmetoo(14,223029,'E');</SCRIPT> ONMOUSEOVER = "self.status = 'E14'; return true" ONMOUSEOUT = "self.status = self.defaultStatus">E14</A> </TD><TD BGCOLOR="#FFFFCC"> Make destructors virtual in base classes.</TD></TR>
<TR><TD BGCOLOR="#FFFFCC" ALIGN="center"><B><A NAME="rule11">11</A></B></TD><TD BGCOLOR="#FFFFCC" ALIGN="center"> <SCRIPT>sendmetoo(15,2182,'E');</SCRIPT> ONMOUSEOVER = "self.status = 'E15'; return true" ONMOUSEOUT = "self.status = self.defaultStatus">E15</A> </TD><TD BGCOLOR="#FFFFCC">Have the definition of operator= return a reference to <CODE>*this</CODE>. (Note: this says nothing about declarations.)</TD></TR>
<TR><TD BGCOLOR="#FFFFCC" ALIGN="center"><B><A NAME="rule12a">12a</A></B></TD><TD BGCOLOR="#FFFFCC" ALIGN="center"> <SCRIPT>sendmetoo(16,2225,'E');</SCRIPT> ONMOUSEOVER = "self.status = 'E16'; return true" ONMOUSEOUT = "self.status = self.defaultStatus">E16</A></TD><TD BGCOLOR="#FFFFCC">Assign to every local data member inside <CODE>operator=</CODE>.</TD></TR>
<TR><TD BGCOLOR="#FFFFCC" ALIGN="center"><B><A NAME="rule12b">12b</A></B></TD><TD BGCOLOR="#FFFFCC" ALIGN="center"><SCRIPT>sendmetoo(16,2225,'E');</SCRIPT> ONMOUSEOVER = "self.status = 'E16'; return true" ONMOUSEOUT = "self.status = self.defaultStatus">E16</A></TD><TD BGCOLOR="#FFFFCC">Call a base class operator= from a derived class <CODE>operator=</CODE>.
<TR><TD BGCOLOR="#FFFFCC" ALIGN="center"><B><A NAME="rule12c">12c</A></B></TD><TD ALIGN="center" BGCOLOR="#FFFFCC"><SCRIPT>sendmetoo(16,2225,'E');</SCRIPT> ONMOUSEOVER = "self.status = 'E16'; return true" ONMOUSEOUT = "self.status = self.defaultStatus">E16</A></TD><TD BGCOLOR="#FFFFCC">Use the member initialization list to ensure that a base class copy ctor is called from a derived class copy <CODE>ctor</CODE>.</TD></TR>
<TR><TD BGCOLOR="#FFFFCC" ALIGN="center"><B><A NAME="rule13">13</A></B></TD><TD BGCOLOR="#FFFFCC" ALIGN="center">N/A</TD><TD BGCOLOR="#FFFFCC">Don't call virtual functions in constructors or destructors.</TD></TR>
</TABLE>
<A NAME="AUTO00025"></A>
<TABLE WIDTH="95%" BORDER="1" CELLPADDING="3" CELLSPACING="0" ALIGN="center" BGCOLOR="#FFFFCC">
<TR><TD BGCOLOR="#000000" COLSPAN="3" ALIGN="center"><B><FONT COLOR="#FFFFFF">Design</FONT></B></TD></TR>
<TR><TD BGCOLOR="#FFFFCC" ALIGN="center" WIDTH=10%"><B><A NAME="rule14">14</A></B></TD><TD BGCOLOR="#FFFFCC" ALIGN="center" WIDTH=10%"><SCRIPT>sendmetoo(19,5887,'E');</SCRIPT> ONMOUSEOVER = "self.status = 'E19'; return true" ONMOUSEOUT = "self.status = self.defaultStatus">E19</A> </TD><TD BGCOLOR="#FFFFCC" WIDTH="80%">Use non-member functions for binary operations like +-/* when a class has a converting <CODE>ctor</CODE>.</TD></TR>
<TR><TD BGCOLOR="#FFFFCC" ALIGN="center"><B><A NAME="rule15">15</A></B></TD><TD BGCOLOR="#FFFFCC" ALIGN="center"><SCRIPT>sendmetoo(20,5976,'E');</SCRIPT> ONMOUSEOVER = "self.status = 'E20'; return true" ONMOUSEOUT = "self.status = self.defaultStatus">E20</A></TD><TD BGCOLOR="#FFFFCC">Avoid public data members.</TD></TR>
<TR><TD BGCOLOR="#FFFFCC" ALIGN="center"><B><A NAME="rule16">16</A></B></TD><TD BGCOLOR="#FFFFCC" ALIGN="center"><SCRIPT>sendmetoo(22,6133,'E');</SCRIPT> ONMOUSEOVER = "self.status = 'E22'; return true" ONMOUSEOUT = "self.status = self.defaultStatus">E22</A></TD><TD BGCOLOR="#FFFFCC">Use pass-by-ref-to-const instead of pass-by-value where both are valid and the former is likely to be more efficient.</TD></TR>
<TR><TD BGCOLOR="#FFFFCC" ALIGN="center"><B><A NAME="rule17a">17a</A></B></TD><TD BGCOLOR="#FFFFCC" ALIGN="center"><SCRIPT>sendmetoo(23,6210,'E');</SCRIPT> ONMOUSEOVER = "self.status = 'E23'; return true" ONMOUSEOUT = "self.status = self.defaultStatus">E23</A></TD><TD BGCOLOR="#FFFFCC">Have operators like <CODE>+-/*</CODE> return an object, not a reference.</TD></TR>
<TR><TD BGCOLOR="#FFFFCC" ALIGN="center"><B><A NAME="rule17b">17b</A></B></TD><TD BGCOLOR="#FFFFCC" ALIGN="center"><SCRIPT>sendmetoo(6,5262,'M');</SCRIPT> ONMOUSEOVER = "self.status = 'M6'; return true" ONMOUSEOUT = "self.status = self.defaultStatus">M6</A></TD><TD BGCOLOR="#FFFFCC">And make those return values <CODE>const</CODE>.</TD></TR>
<TR><TD BGCOLOR="#FFFFCC" ALIGN="center"><B><A NAME="rule18">18</A></B></TD><TD BGCOLOR="#FFFFCC" ALIGN="center"><SCRIPT>sendmetoo(25,6292,'E');</SCRIPT> ONMOUSEOVER = "self.status = 'E25'; return true" ONMOUSEOUT = "self.status = self.defaultStatus">E25</A></TD><TD BGCOLOR="#FFFFCC">Don't overload on a pointer and an <CODE>int</CODE>.</TD></TR>
<TR><TD BGCOLOR="#FFFFCC" ALIGN="center"><B><A NAME="rule19">19</A></B></TD><TD BGCOLOR="#FFFFCC" ALIGN="center"><SCRIPT>sendmetoo(33,10947,'M');</SCRIPT> ONMOUSEOVER = "self.status = 'M33'; return true" ONMOUSEOUT = "self.status = self.defaultStatus">M33</A></TD><TD BGCOLOR="#FFFFCC">Make non-leaf classes abstract.</TD></TR>
<TR><TD BGCOLOR="#FFFFCC" ALIGN="center"><B><A NAME="rule20">20</A></B></TD><TD BGCOLOR="#FFFFCC" ALIGN="center"><SCRIPT>sendmetoo(24,41284,'M');</SCRIPT> ONMOUSEOVER = "self.status = 'M24'; return true" ONMOUSEOUT = "self.status = self.defaultStatus">M24</A></TD><TD BGCOLOR="#FFFFCC">Avoid gratuitous use of virtual inheritance, i.e., make sure there are at least two inheritance paths to each virtual base class.</TD></TR>
</TABLE>
<A NAME="AUTO00026"></A>
<TABLE WIDTH="95%" BORDER="1" CELLPADDING="3" CELLSPACING="0" ALIGN="center" BGCOLOR="#FFFFCC">
<TR><TD BGCOLOR="#000000" COLSPAN="3" ALIGN="center"><B><FONT COLOR="#FFFFFF">Implementation</FONT></B></TD></TR>
<TR><TD BGCOLOR="#FFFFCC" ALIGN="center" WIDTH="10%"><B><A NAME="rule21">21</A></B></TD><TD BGCOLOR="#FFFFCC" ALIGN="center" WIDTH="10%"><SCRIPT>sendmetoo(29,6490,'E');</SCRIPT> ONMOUSEOVER = "self.status = 'E29'; return true" ONMOUSEOUT = "self.status = self.defaultStatus">E29</A></TD><TD BGCOLOR="#FFFFCC" WIDTH="80%">Don't return pointers/references to internal data structures unless they are pointers/references-to-const.</TD></TR>
<TR><TD BGCOLOR="#FFFFCC" ALIGN="center" WIDTH="10%"><B><A NAME="rule22">22</A></B></TD><TD BGCOLOR="#FFFFCC" ALIGN="center" WIDTH="10%"><SCRIPT>sendmetoo(26,5350,'M');</SCRIPT> ONMOUSEOVER = "self.status = 'M26'; return true" ONMOUSEOUT = "self.status = self.defaultStatus">M26</A></TD><TD BGCOLOR="#FFFFCC" WIDTH="80%">Never define a static variable inside a non-member inline function unless the function is declared extern. [Note: In July 1996, changes to the nascent standard for ANSI/ISO C++ obviated the need for this rule, at least on paper. However, the need still exists in practice, because many compilers continue to heed the older rules that can lead to duplicated variables in inline non-member functions.]</TD></TR>
<TR><TD BGCOLOR="#FFFFCC" ALIGN="center"><B><A NAME="rule23">23</A></B></TD><TD WIDTH="10%" ALIGN="CENTER" BGCOLOR="#FFFFCC">N/A</TD><TD BGCOLOR="#FFFFCC">Avoid use of "..." in function parameter lists.</TD></TR>
</TABLE>
<A NAME="AUTO00027"></A>
<TABLE WIDTH="95%" BORDER="1" CELLPADDING="3" CELLSPACING="0" ALIGN="center" BGCOLOR="#FFFFCC">
<TR><TD BGCOLOR="#000000" COLSPAN="3" ALIGN="center"><B><FONT COLOR="#FFFFFF">Inheritance</FONT></B></TD></TR>
<TR><TD BGCOLOR="#FFFFCC" ALIGN="center" WIDTH=10%"><B><A NAME="rule24">24</A></B></TD><TD BGCOLOR="#FFFFCC" ALIGN="center" WIDTH="10%"><SCRIPT>sendmetoo(37,7167,'E');</SCRIPT> ONMOUSEOVER = "self.status = 'E37'; return true" ONMOUSEOUT = "self.status = self.defaultStatus">E37</A></TD><TD BGCOLOR="#FFFFCC" WIDTH="80%">Don't redefine an inherited non virtual function.</TD></TR>
<TR><TD BGCOLOR="#FFFFCC" ALIGN="center"><B><A NAME="rule25">25</A></B></TD><TD BGCOLOR="#FFFFCC" ALIGN="center"><SCRIPT>sendmetoo(38,177948,'E');</SCRIPT> ONMOUSEOVER = "self.status = 'E38'; return true" ONMOUSEOUT = "self.status = self.defaultStatus">E38</A></TD><TD BGCOLOR="#FFFFCC">Don't redefine an inherited default parameter value.</TD></TR>
</TABLE>
<A NAME="AUTO00028"></A>
<TABLE WIDTH="95%" BORDER="1" CELLPADDING="3" CELLSPACING="0" ALIGN="center" BGCOLOR="#FFFFCC">
<TR><TD BGCOLOR="#000000" COLSPAN="3" ALIGN="center"><B><FONT COLOR="#FFFFFF">Operators</FONT></B></TD></TR>
<TR><TD BGCOLOR="#FFFFCC" ALIGN="center" WIDTH="10%"><B><A NAME="rule26">26</A></B></TD><TD BGCOLOR="#FFFFCC" ALIGN="center" WIDTH="10%"><SCRIPT>sendmetoo(5,5970,'M');</SCRIPT> ONMOUSEOVER = "self.status = 'M5'; return true" ONMOUSEOUT = "self.status = self.defaultStatus">M5</A></TD><TD BGCOLOR="#FFFFCC" WIDTH="80%">Avoid use of user-defined conversion operators (i.e., non-explicit single-argument ctors and implicit type conversion operators).</TD></TR>
<TR><TD BGCOLOR="#FFFFCC" ALIGN="center"><B><A NAME="rule27">27</A></B></TD><TD BGCOLOR="#FFFFCC" ALIGN="center"><SCRIPT>sendmetoo(7,77702,'M');</SCRIPT> ONMOUSEOVER = "self.status = 'M7'; return true" ONMOUSEOUT = "self.status = self.defaultStatus">M7</A></TD><TD BGCOLOR="#FFFFCC">Don't overload <CODE>&&</CODE>, <CODE>||</CODE>, or ,<CODE>.</CODE></TD></TR>
<TR><TD BGCOLOR="#FFFFCC" ALIGN="center"><B><A NAME="rule28">28</A></B></TD><TD BGCOLOR="#FFFFCC" ALIGN="center"><SCRIPT>sendmetoo(6,5262,'M');</SCRIPT> ONMOUSEOVER = "self.status = 'M6'; return true" ONMOUSEOUT = "self.status = self.defaultStatus">M6</A></TD><TD BGCOLOR="#FFFFCC">Make sure operators ++ and — have the correct return type.</TD></TR>
<TR><TD BGCOLOR="#FFFFCC" ALIGN="center"><B> <A NAME="rule29">29</A></B></TD><TD BGCOLOR="#FFFFCC" ALIGN="center"><SCRIPT>sendmetoo(6,5262,'M');</SCRIPT> ONMOUSEOVER = "self.status = 'M6'; return true" ONMOUSEOUT = "self.status = self.defaultStatus">M6</A></TD><TD BGCOLOR="#FFFFCC">Use prefix ++ and — when the result of the increment or decrement expression is unused.</TD></TR>
<TR><TD BGCOLOR="#FFFFCC" ALIGN="center"><B><A NAME="rule30">30</A></B></TD><TD BGCOLOR="#FFFFCC" ALIGN="center"> <SCRIPT>sendmetoo(22,41251,'M');</SCRIPT> ONMOUSEOVER = "self.status = 'M22'; return true" ONMOUSEOUT = "self.status = self.defaultStatus">M22</A> </TD><TD BGCOLOR="#FFFFCC">Declare <CODE>op=</CODE> if you declare binary <CODE>op</CODE> (e.g., declare <CODE>+=</CODE> if you declare <CODE>+</CODE>, declare <CODE>-=</CODE> if you declare <CODE>-</CODE>, etc.). One way to satisfy this constraint is by providing a template that yields the appropriate function.</TD></TR>
</TABLE>
<A NAME="AUTO00029"></A>
<TABLE WIDTH="95%" BORDER="1" CELLPADDING="3" CELLSPACING="0" ALIGN="center" BGCOLOR="#FFFFCC">
<TR><TD BGCOLOR="#000000" COLSPAN="3" ALIGN="center"><B><FONT COLOR="#FFFFFF">Exceptions</FONT></B></TH></TR>
<TR><TD BGCOLOR="#FFFFCC" ALIGN="center" WIDTH="10%"><B><A NAME="rule31">31</A></B></TD><TD BGCOLOR="#FFFFCC" ALIGN="center" WIDTH="10%"><SCRIPT>sendmetoo(11,39749,'M');</SCRIPT> ONMOUSEOVER = "self.status = 'M11'; return true" ONMOUSEOUT = "self.status = self.defaultStatus">M11</A></TD><TD BGCOLOR="#FFFFCC" WIDTH="80%">Prevent exceptions from leaving destructors.</TD></TR>
<TR><TD BGCOLOR="#FFFFCC" ALIGN="center" WIDTH="10%"><B><A NAME="rule32">32</A></B></TD><TD BGCOLOR="#FFFFCC" ALIGN="center" WIDTH="10%"><SCRIPT>sendmetoo(13,38224,'M');</SCRIPT> ONMOUSEOVER = "self.status = 'M13'; return true" ONMOUSEOUT = "self.status = self.defaultStatus">M13</A></TD><TD BGCOLOR="#FFFFCC" WIDTH="80%">Catch exceptions by reference.</TD></TR>
</TABLE>
<P><A NAME="dingp32"></A><A NAME="AUTO00030"></A>Some of the rules may seem controversial, especially in light of the
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -