⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 swapmacro.html

📁 this is a mirrored site c-faq. thought might need offline
💻 HTML
字号:
<!DOCTYPE HTML PUBLIC "-//W3O//DTD W3 HTML 2.0//EN"><!-- This collection of hypertext pages is Copyright 1995-2005 by Steve Summit. --><!-- Content from the book "C Programming FAQs: Frequently Asked Questions" --><!-- (Addison-Wesley, 1995, ISBN 0-201-84519-9) is made available here by --><!-- permission of the author and the publisher as a service to the community. --><!-- It is intended to complement the use of the published text --><!-- and is protected by international copyright laws. --><!-- The on-line content may be accessed freely for personal use --><!-- but may not be published or retransmitted without explicit permission. --><!-- --><!-- this page built Sat Dec 24 21:47:46 2005 by faqproc version 2.7 --><!-- from source file cpp.sgml dated Wed Dec 21 13:52:14 2005 --><!-- corresponding to FAQ list version 4.0 --><html><!-- Mirrored from c-faq.com/cpp/swapmacro.html by HTTrack Website Copier/3.x [XR&CO'2008], Sat, 14 Mar 2009 07:58:53 GMT --><head><meta name=GENERATOR content="faqproc"><title>Question 10.3</title><link href="slm.html" rev=precedes><link href="multistmt.html" rel=precedes><link href="index.html" rev=subdocument></head><body bgcolor="#ffffff"><a href="slm.html" rev=precedes><img src="../images/buttonleft.gif" alt="prev"></a><a href="index.html" rev=subdocument><img src="../images/buttonup.gif" alt="up"></a><a href="multistmt.html" rel=precedes><img src="../images/buttonright.gif" alt="next"></a>&nbsp;<a href="../index-2.html"><img src="../images/buttontop.gif" alt="top/contents"></a><a href="../search.html"><img src="../images/buttonsrch.gif" alt="search"></a><hr><p><!-- qbegin --><h1>comp.lang.c FAQ list<font color=blue>&middot;</font><!-- qtag -->Question 10.3</h1><p><font face=Helvetica size=8 color=blue><b>Q:</b></font>How can I write a generic macro to swap two values?</p><p><hr><p><font face=Helvetica size=8 color=blue><b>A:</b></font>There is no good answer to this question.If the values are integers, a well-known trick using exclusive-ORcould perhapsbe used,but it will not work for floating-point values orpointers,or if the two values are the same variable.(See questions <a href="../expr/xorswapexpr.html">3.3b</a> and <a href="../misc/swapnotemp.html">20.15c</a>.)If the macro is intended to beused on values of arbitrary type(the usual goal),any solution involving a temporary variable is problematical,because:<UL><li>It's hard to givethe temporarya name that won't clash with anything.(Any name you pickmight be the actual name of one of the variables being swapped.If you triedusing <TT>##</TT>to concatenate the names of the two actual arguments,to ensure that it won't match either one,it might still not be uniqueif the concatenated name is longer than 31 characters,<a href="identl.html" rel=subdocument>[footnote]</a>and itwouldn't let you swap things like <TT>a[i]</TT> that aren't simple identifiers.You could probably get away with using a name like <TT>_tmp</TT> in the ``no man's land'' between the user and implementation namespaces; see question <a href="../decl/namespace.html">1.29</a>.)<li>Either it can't be declared with the right type(because standard C does not provide a <TT>typeof</TT> operator),or(if it copies objects byte-by-byte,perhaps with <TT>memcpy</TT>,to a temporary array sized with <TT>sizeof</TT>)the macro can't be used on operands which are declared <TT>register</TT>.</UL></p><p>The best all-around solution is probably to forget about using amacro,unless you're willing to pass in the type as a third argument.(Also,if you're trying to swap entire structures or arrays,you probably want toexchange pointersinstead.)If you're worried about the use of an ugly temporary, and knowthat your machine provides an efficient exchange instruction, convince yourcompiler vendor to recognize the standard three-assignment swapidiom in the optimization phase.</p><p>If you're consumed by a passionate desireto solve this problem once and for all,please reconsider;there are better problems worthier of your energies.</p><p>Additional links:<a href="sd6.html" rel=subdocument>so you think you have a solution</a></p><!-- aend --><p><hr><a href="slm.html" rev=precedes><img src="../images/buttonleft.gif" alt="prev"></a><a href="index.html" rev=subdocument><img src="../images/buttonup.gif" alt="up"></a><a href="multistmt.html" rel=precedes><img src="../images/buttonright.gif" alt="next"></a>&nbsp;<a href="../questions.html"><img src="../images/buttontop.gif" alt="contents"></a><a href="../search.html"><img src="../images/buttonsrch.gif" alt="search"></a><br><!-- lastfooter --><a href="../about.html">about this FAQ list</a>&nbsp;<a href="../eskimo.html">about eskimo</a>&nbsp;<a href="../search.html">search</a>&nbsp;<a href="../feedback.html">feedback</a>&nbsp;<a href="copyright.html">copyright</a><p>Hosted by<a href="http://www.eskimo.com/"><img src="../../www.eskimo.com/img/link/eskitiny.gif" alt="Eskimo North"></a></body><!-- Mirrored from c-faq.com/cpp/swapmacro.html by HTTrack Website Copier/3.x [XR&CO'2008], Sat, 14 Mar 2009 07:58:53 GMT --></html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -