ext_ffi_api.html 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
  2. <html>
  3. <head>
  4. <title>ffi.* API Functions</title>
  5. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  6. <meta name="Author" content="Mike Pall">
  7. <meta name="Copyright" content="Copyright (C) 2005-2011, Mike Pall">
  8. <meta name="Language" content="en">
  9. <link rel="stylesheet" type="text/css" href="bluequad.css" media="screen">
  10. <link rel="stylesheet" type="text/css" href="bluequad-print.css" media="print">
  11. <style type="text/css">
  12. table.abitable { width: 30em; line-height: 1.2; }
  13. tr.abihead td { font-weight: bold; }
  14. td.abiparam { font-weight: bold; width: 6em; }
  15. </style>
  16. </head>
  17. <body>
  18. <div id="site">
  19. <a href="http://luajit.org"><span>Lua<span id="logo">JIT</span></span></a>
  20. </div>
  21. <div id="head">
  22. <h1><tt>ffi.*</tt> API Functions</h1>
  23. </div>
  24. <div id="nav">
  25. <ul><li>
  26. <a href="luajit.html">LuaJIT</a>
  27. <ul><li>
  28. <a href="install.html">Installation</a>
  29. </li><li>
  30. <a href="running.html">Running</a>
  31. </li></ul>
  32. </li><li>
  33. <a href="extensions.html">Extensions</a>
  34. <ul><li>
  35. <a href="ext_ffi.html">FFI Library</a>
  36. <ul><li>
  37. <a href="ext_ffi_tutorial.html">FFI Tutorial</a>
  38. </li><li>
  39. <a class="current" href="ext_ffi_api.html">ffi.* API</a>
  40. </li><li>
  41. <a href="ext_ffi_semantics.html">FFI Semantics</a>
  42. </li></ul>
  43. </li><li>
  44. <a href="ext_jit.html">jit.* Library</a>
  45. </li><li>
  46. <a href="ext_c_api.html">Lua/C API</a>
  47. </li></ul>
  48. </li><li>
  49. <a href="status.html">Status</a>
  50. <ul><li>
  51. <a href="changes.html">Changes</a>
  52. </li></ul>
  53. </li><li>
  54. <a href="faq.html">FAQ</a>
  55. </li><li>
  56. <a href="http://luajit.org/performance.html">Performance <span class="ext">&raquo;</span></a>
  57. </li><li>
  58. <a href="http://luajit.org/download.html">Download <span class="ext">&raquo;</span></a>
  59. </li></ul>
  60. </div>
  61. <div id="main">
  62. <p>
  63. This page describes the API functions provided by the FFI library in
  64. detail. It's recommended to read through the
  65. <a href="ext_ffi.html">introduction</a> and the
  66. <a href="ext_ffi_tutorial.html">FFI tutorial</a> first.
  67. </p>
  68. <h2 id="glossary">Glossary</h2>
  69. <ul>
  70. <li><b>cdecl</b> &mdash; An abstract C&nbsp;type declaration (a Lua
  71. string).</li>
  72. <li><b>ctype</b> &mdash; A C&nbsp;type object. This is a special kind of
  73. <b>cdata</b> returned by <tt>ffi.typeof()</tt>. It serves as a
  74. <b>cdata</b> <a href="#ffi_new">constructor</a> when called.</li>
  75. <li><b>cdata</b> &mdash; A C&nbsp;data object. It holds a value of the
  76. corresponding <b>ctype</b>.</li>
  77. <li><b>ct</b> &mdash; A C&nbsp;type specification which can be used for
  78. most of the API functions. Either a <b>cdecl</b>, a <b>ctype</b> or a
  79. <b>cdata</b> serving as a template type.</li>
  80. <li><b>VLA</b> &mdash; A variable-length array is declared with a
  81. <tt>?</tt> instead of the number of elements, e.g. <tt>"int[?]"</tt>.
  82. The number of elements (<tt>nelem</tt>) must be given when it's
  83. <a href="#ffi_new">created</a>.</li>
  84. <li><b>VLS</b> &mdash; A variable-length struct is a <tt>struct</tt> C
  85. type where the last element is a <b>VLA</b>. The same rules for
  86. declaration and creation apply.</li>
  87. </ul>
  88. <h2 id="decl">Declaring and Accessing External Symbols</h2>
  89. <p>
  90. External symbols must be declared first and can then be accessed by
  91. indexing a <a href="ext_ffi_semantics.html#clib">C&nbsp;library
  92. namespace</a>, which automatically binds the symbol to a specific
  93. library.
  94. </p>
  95. <h3 id="ffi_cdef"><tt>ffi.cdef(def)</tt></h3>
  96. <p>
  97. Adds multiple C&nbsp;declarations for types or external symbols (named
  98. variables or functions). <tt>def</tt> must be a Lua string. It's
  99. recommended to use the syntactic sugar for string arguments as
  100. follows:
  101. </p>
  102. <pre class="code">
  103. ffi.cdef[[
  104. <span style="color:#00a000;">typedef struct foo { int a, b; } foo_t; // Declare a struct and typedef.
  105. int dofoo(foo_t *f, int n); /* Declare an external C function. */</span>
  106. ]]
  107. </pre>
  108. <p>
  109. The contents of the string (the part in green above) must be a
  110. sequence of
  111. <a href="ext_ffi_semantics.html#clang">C&nbsp;declarations</a>,
  112. separated by semicolons. The trailing semicolon for a single
  113. declaration may be omitted.
  114. </p>
  115. <p>
  116. Please note that external symbols are only <em>declared</em>, but they
  117. are <em>not bound</em> to any specific address, yet. Binding is
  118. achieved with C&nbsp;library namespaces (see below).
  119. </p>
  120. <p style="color: #c00000;">
  121. C&nbsp;declarations are not passed through a C&nbsp;pre-processor,
  122. yet. No pre-processor tokens are allowed, except for
  123. <tt>#pragma&nbsp;pack</tt>. Replace <tt>#define</tt> in existing
  124. C&nbsp;header files with <tt>enum</tt>, <tt>static&nbsp;const</tt>
  125. or <tt>typedef</tt> and/or pass the files through an external
  126. C&nbsp;pre-processor (once). Be careful not to include unneeded or
  127. redundant declarations from unrelated header files.
  128. </p>
  129. <h3 id="ffi_C"><tt>ffi.C</tt></h3>
  130. <p>
  131. This is the default C&nbsp;library namespace &mdash; note the
  132. uppercase <tt>'C'</tt>. It binds to the default set of symbols or
  133. libraries on the target system. These are more or less the same as a
  134. C&nbsp;compiler would offer by default, without specifying extra link
  135. libraries.
  136. </p>
  137. <p>
  138. On POSIX systems, this binds to symbols in the default or global
  139. namespace. This includes all exported symbols from the executable and
  140. any libraries loaded into the global namespace. This includes at least
  141. <tt>libc</tt>, <tt>libm</tt>, <tt>libdl</tt> (on Linux),
  142. <tt>libgcc</tt> (if compiled with GCC), as well as any exported
  143. symbols from the Lua/C&nbsp;API provided by LuaJIT itself.
  144. </p>
  145. <p>
  146. On Windows systems, this binds to symbols exported from the
  147. <tt>*.exe</tt>, the <tt>lua51.dll</tt> (i.e. the Lua/C&nbsp;API
  148. provided by LuaJIT itself), the C&nbsp;runtime library LuaJIT was linked
  149. with (<tt>msvcrt*.dll</tt>), <tt>kernel32.dll</tt>,
  150. <tt>user32.dll</tt> and <tt>gdi32.dll</tt>.
  151. </p>
  152. <h3 id="ffi_load"><tt>clib = ffi.load(name [,global])</tt></h3>
  153. <p>
  154. This loads the dynamic library given by <tt>name</tt> and returns
  155. a new C&nbsp;library namespace which binds to its symbols. On POSIX
  156. systems, if <tt>global</tt> is <tt>true</tt>, the library symbols are
  157. loaded into the global namespace, too.
  158. </p>
  159. <p>
  160. If <tt>name</tt> is a path, the library is loaded from this path.
  161. Otherwise <tt>name</tt> is canonicalized in a system-dependent way and
  162. searched in the default search path for dynamic libraries:
  163. </p>
  164. <p>
  165. On POSIX systems, if the name contains no dot, the extension
  166. <tt>.so</tt> is appended. Also, the <tt>lib</tt> prefix is prepended
  167. if necessary. So <tt>ffi.load("z")</tt> looks for <tt>"libz.so"</tt>
  168. in the default shared library search path.
  169. </p>
  170. <p>
  171. On Windows systems, if the name contains no dot, the extension
  172. <tt>.dll</tt> is appended. So <tt>ffi.load("ws2_32")</tt> looks for
  173. <tt>"ws2_32.dll"</tt> in the default DLL search path.
  174. </p>
  175. <h2 id="create">Creating cdata Objects</h2>
  176. <p>
  177. The following API functions create cdata objects (<tt>type()</tt>
  178. returns <tt>"cdata"</tt>). All created cdata objects are
  179. <a href="ext_ffi_semantics.html#gc">garbage collected</a>.
  180. </p>
  181. <h3 id="ffi_new"><tt>cdata = ffi.new(ct [,nelem] [,init...])<br>
  182. cdata = <em>ctype</em>([nelem,] [init...])</tt></h3>
  183. <p>
  184. Creates a cdata object for the given <tt>ct</tt>. VLA/VLS types
  185. require the <tt>nelem</tt> argument. The second syntax uses a ctype as
  186. a constructor and is otherwise fully equivalent.
  187. </p>
  188. <p>
  189. The cdata object is initialized according to the
  190. <a href="ext_ffi_semantics.html#init">rules for initializers</a>,
  191. using the optional <tt>init</tt> arguments. Excess initializers cause
  192. an error.
  193. </p>
  194. <p>
  195. Performance notice: if you want to create many objects of one kind,
  196. parse the cdecl only once and get its ctype with
  197. <tt>ffi.typeof()</tt>. Then use the ctype as a constructor repeatedly.
  198. </p>
  199. <p style="font-size: 8pt;">
  200. Please note that an anonymous <tt>struct</tt> declaration implicitly
  201. creates a new and distinguished ctype every time you use it for
  202. <tt>ffi.new()</tt>. This is probably <b>not</b> what you want,
  203. especially if you create more than one cdata object. Different anonymous
  204. <tt>structs</tt> are not considered assignment-compatible by the
  205. C&nbsp;standard, even though they may have the same fields! Also, they
  206. are considered different types by the JIT-compiler, which may cause an
  207. excessive number of traces. It's strongly suggested to either declare
  208. a named <tt>struct</tt> or <tt>typedef</tt> with <tt>ffi.cdef()</tt>
  209. or to create a single ctype object for an anonymous <tt>struct</tt>
  210. with <tt>ffi.typeof()</tt>.
  211. </p>
  212. <h3 id="ffi_typeof"><tt>ctype = ffi.typeof(ct)</tt></h3>
  213. <p>
  214. Creates a ctype object for the given <tt>ct</tt>.
  215. </p>
  216. <p>
  217. This function is especially useful to parse a cdecl only once and then
  218. use the resulting ctype object as a <a href="#ffi_new">constructor</a>.
  219. </p>
  220. <h3 id="ffi_cast"><tt>cdata = ffi.cast(ct, init)</tt></h3>
  221. <p>
  222. Creates a scalar cdata object for the given <tt>ct</tt>. The cdata
  223. object is initialized with <tt>init</tt> using the "cast" variant of
  224. the <a href="ext_ffi_semantics.html#convert">C&nbsp;type conversion
  225. rules</a>.
  226. </p>
  227. <p>
  228. This functions is mainly useful to override the pointer compatibility
  229. checks or to convert pointers to addresses or vice versa.
  230. </p>
  231. <h3 id="ffi_metatype"><tt>ctype = ffi.metatype(ct, metatable)</tt></h3>
  232. <p>
  233. Creates a ctype object for the given <tt>ct</tt> and associates it with
  234. a metatable. Only <tt>struct</tt>/<tt>union</tt> types, complex numbers
  235. and vectors are allowed. Other types may be wrapped in a
  236. <tt>struct</tt>, if needed.
  237. </p>
  238. <p>
  239. The association with a metatable is permanent and cannot be changed
  240. afterwards. Neither the contents of the <tt>metatable</tt> nor the
  241. contents of an <tt>__index</tt> table (if any) may be modified
  242. afterwards. The associated metatable automatically applies to all uses
  243. of this type, no matter how the objects are created or where they
  244. originate from. Note that pre-defined operations on types have
  245. precedence (e.g. declared field names cannot be overriden).
  246. </p>
  247. <p>
  248. All standard Lua metamethods are implemented. These are called directly,
  249. without shortcuts and on any mix of types. For binary operations, the
  250. left operand is checked first for a valid ctype metamethod. The
  251. <tt>__gc</tt> metamethod only applies to <tt>struct</tt>/<tt>union</tt>
  252. types and performs an implicit <a href="#ffi_gc"><tt>ffi.gc()</tt></a>
  253. call during creation of an instance.
  254. </p>
  255. <h3 id="ffi_gc"><tt>cdata = ffi.gc(cdata, finalizer)</tt></h3>
  256. <p>
  257. Associates a finalizer with a pointer or aggregate cdata object. The
  258. cdata object is returned unchanged.
  259. </p>
  260. <p>
  261. This function allows safe integration of unmanaged resources into the
  262. automatic memory management of the LuaJIT garbage collector. Typical
  263. usage:
  264. </p>
  265. <pre class="code">
  266. local p = ffi.gc(ffi.C.malloc(n), ffi.C.free)
  267. ...
  268. p = nil -- Last reference to p is gone.
  269. -- GC will eventually run finalizer: ffi.C.free(p)
  270. </pre>
  271. <p>
  272. A cdata finalizer works like the <tt>__gc</tt> metamethod for userdata
  273. objects: when the last reference to a cdata object is gone, the
  274. associated finalizer is called with the cdata object as an argument. The
  275. finalizer can be a Lua function or a cdata function or cdata function
  276. pointer. An existing finalizer can be removed by setting a <tt>nil</tt>
  277. finalizer, e.g. right before explicitly deleting a resource:
  278. </p>
  279. <pre class="code">
  280. ffi.C.free(ffi.gc(p, nil)) -- Manually free the memory.
  281. </pre>
  282. <h2 id="info">C&nbsp;Type Information</h2>
  283. <p>
  284. The following API functions return information about C&nbsp;types.
  285. They are most useful for inspecting cdata objects.
  286. </p>
  287. <h3 id="ffi_sizeof"><tt>size = ffi.sizeof(ct [,nelem])</tt></h3>
  288. <p>
  289. Returns the size of <tt>ct</tt> in bytes. Returns <tt>nil</tt> if
  290. the size is not known (e.g. for <tt>"void"</tt> or function types).
  291. Requires <tt>nelem</tt> for VLA/VLS types, except for cdata objects.
  292. </p>
  293. <h3 id="ffi_alignof"><tt>align = ffi.alignof(ct)</tt></h3>
  294. <p>
  295. Returns the minimum required alignment for <tt>ct</tt> in bytes.
  296. </p>
  297. <h3 id="ffi_offsetof"><tt>ofs [,bpos,bsize] = ffi.offsetof(ct, field)</tt></h3>
  298. <p>
  299. Returns the offset (in bytes) of <tt>field</tt> relative to the start
  300. of <tt>ct</tt>, which must be a <tt>struct</tt>. Additionally returns
  301. the position and the field size (in bits) for bit fields.
  302. </p>
  303. <h3 id="ffi_istype"><tt>status = ffi.istype(ct, obj)</tt></h3>
  304. <p>
  305. Returns <tt>true</tt> if <tt>obj</tt> has the C&nbsp;type given by
  306. <tt>ct</tt>. Returns <tt>false</tt> otherwise.
  307. </p>
  308. <p>
  309. C&nbsp;type qualifiers (<tt>const</tt> etc.) are ignored. Pointers are
  310. checked with the standard pointer compatibility rules, but without any
  311. special treatment for <tt>void&nbsp;*</tt>. If <tt>ct</tt> specifies a
  312. <tt>struct</tt>/<tt>union</tt>, then a pointer to this type is accepted,
  313. too. Otherwise the types must match exactly.
  314. </p>
  315. <p>
  316. Note: this function accepts all kinds of Lua objects for the
  317. <tt>obj</tt> argument, but always returns <tt>false</tt> for non-cdata
  318. objects.
  319. </p>
  320. <h2 id="util">Utility Functions</h2>
  321. <h3 id="ffi_string"><tt>str = ffi.string(ptr [,len])</tt></h3>
  322. <p>
  323. Creates an interned Lua string from the data pointed to by
  324. <tt>ptr</tt>.
  325. </p>
  326. <p>
  327. If the optional argument <tt>len</tt> is missing, <tt>ptr</tt> is
  328. converted to a <tt>"char&nbsp;*"</tt> and the data is assumed to be
  329. zero-terminated. The length of the string is computed with
  330. <tt>strlen()</tt>.
  331. </p>
  332. <p>
  333. Otherwise <tt>ptr</tt> is converted to a <tt>"void&nbsp;*"</tt> and
  334. <tt>len</tt> gives the length of the data. The data may contain
  335. embedded zeros and need not be byte-oriented (though this may cause
  336. endianess issues).
  337. </p>
  338. <p>
  339. This function is mainly useful to convert (temporary)
  340. <tt>"const&nbsp;char&nbsp;*"</tt> pointers returned by
  341. C&nbsp;functions to Lua strings and store them or pass them to other
  342. functions expecting a Lua string. The Lua string is an (interned) copy
  343. of the data and bears no relation to the original data area anymore.
  344. Lua strings are 8&nbsp;bit clean and may be used to hold arbitrary,
  345. non-character data.
  346. </p>
  347. <p>
  348. Performance notice: it's faster to pass the length of the string, if
  349. it's known. E.g. when the length is returned by a C&nbsp;call like
  350. <tt>sprintf()</tt>.
  351. </p>
  352. <h3 id="ffi_copy"><tt>ffi.copy(dst, src, len)<br>
  353. ffi.copy(dst, str)</tt></h3>
  354. <p>
  355. Copies the data pointed to by <tt>src</tt> to <tt>dst</tt>.
  356. <tt>dst</tt> is converted to a <tt>"void&nbsp;*"</tt> and <tt>src</tt>
  357. is converted to a <tt>"const void&nbsp;*"</tt>.
  358. </p>
  359. <p>
  360. In the first syntax, <tt>len</tt> gives the number of bytes to copy.
  361. Caveat: if <tt>src</tt> is a Lua string, then <tt>len</tt> must not
  362. exceed <tt>#src+1</tt>.
  363. </p>
  364. <p>
  365. In the second syntax, the source of the copy must be a Lua string. All
  366. bytes of the string <em>plus a zero-terminator</em> are copied to
  367. <tt>dst</tt> (i.e. <tt>#src+1</tt> bytes).
  368. </p>
  369. <p>
  370. Performance notice: <tt>ffi.copy()</tt> may be used as a faster
  371. (inlinable) replacement for the C&nbsp;library functions
  372. <tt>memcpy()</tt>, <tt>strcpy()</tt> and <tt>strncpy()</tt>.
  373. </p>
  374. <h3 id="ffi_fill"><tt>ffi.fill(dst, len [,c])</tt></h3>
  375. <p>
  376. Fills the data pointed to by <tt>dst</tt> with <tt>len</tt> constant
  377. bytes, given by <tt>c</tt>. If <tt>c</tt> is omitted, the data is
  378. zero-filled.
  379. </p>
  380. <p>
  381. Performance notice: <tt>ffi.fill()</tt> may be used as a faster
  382. (inlinable) replacement for the C&nbsp;library function
  383. <tt>memset(dst,&nbsp;c,&nbsp;len)</tt>. Please note the different
  384. order of arguments!
  385. </p>
  386. <h2 id="target">Target-specific Information</h2>
  387. <h3 id="ffi_abi"><tt>status = ffi.abi(param)</tt></h3>
  388. <p>
  389. Returns <tt>true</tt> if <tt>param</tt> (a Lua string) applies for the
  390. target ABI (Application Binary Interface). Returns <tt>false</tt>
  391. otherwise. The following parameters are currently defined:
  392. </p>
  393. <table class="abitable">
  394. <tr class="abihead">
  395. <td class="abiparam">Parameter</td>
  396. <td class="abidesc">Description</td>
  397. </tr>
  398. <tr class="odd separate">
  399. <td class="abiparam">32bit</td><td class="abidesc">32 bit architecture</td></tr>
  400. <tr class="even">
  401. <td class="abiparam">64bit</td><td class="abidesc">64 bit architecture</td></tr>
  402. <tr class="odd separate">
  403. <td class="abiparam">le</td><td class="abidesc">Little-endian architecture</td></tr>
  404. <tr class="even">
  405. <td class="abiparam">be</td><td class="abidesc">Big-endian architecture</td></tr>
  406. <tr class="odd separate">
  407. <td class="abiparam">fpu</td><td class="abidesc">Target has a hardware FPU</td></tr>
  408. <tr class="even">
  409. <td class="abiparam">softfp</td><td class="abidesc">softfp calling conventions</td></tr>
  410. <tr class="odd">
  411. <td class="abiparam">hardfp</td><td class="abidesc">hardfp calling conventions</td></tr>
  412. <tr class="even separate">
  413. <td class="abiparam">eabi</td><td class="abidesc">EABI variant of the standard ABI</td></tr>
  414. <tr class="odd">
  415. <td class="abiparam">win</td><td class="abidesc">Windows variant of the standard ABI</td></tr>
  416. </table>
  417. <h3 id="ffi_os"><tt>ffi.os</tt></h3>
  418. <p>
  419. Contains the target OS name. Same contents as
  420. <a href="ext_jit.html#jit_os"><tt>jit.os</tt></a>.
  421. </p>
  422. <h3 id="ffi_arch"><tt>ffi.arch</tt></h3>
  423. <p>
  424. Contains the target architecture name. Same contents as
  425. <a href="ext_jit.html#jit_arch"><tt>jit.arch</tt></a>.
  426. </p>
  427. <h2 id="extended">Extended Standard Library Functions</h2>
  428. <p>
  429. The following standard library functions have been extended to work
  430. with cdata objects:
  431. </p>
  432. <h3 id="tonumber"><tt>n = tonumber(cdata)</tt></h3>
  433. <p>
  434. Converts a number cdata object to a <tt>double</tt> and returns it as
  435. a Lua number. This is particularly useful for boxed 64&nbsp;bit
  436. integer values. Caveat: this conversion may incur a precision loss.
  437. </p>
  438. <h3 id="tostring"><tt>s = tostring(cdata)</tt></h3>
  439. <p>
  440. Returns a string representation of the value of 64&nbsp;bit integers
  441. (<tt><b>"</b>nnn<b>LL"</b></tt> or <tt><b>"</b>nnn<b>ULL"</b></tt>) or
  442. complex numbers (<tt><b>"</b>re&plusmn;im<b>i"</b></tt>). Otherwise
  443. returns a string representation of the C&nbsp;type of a ctype object
  444. (<tt><b>"ctype&lt;</b>type<b>&gt;"</b></tt>) or a cdata object
  445. (<tt><b>"cdata&lt;</b>type<b>&gt;:&nbsp;</b>address"</tt>).
  446. </p>
  447. <h2 id="literals">Extensions to the Lua Parser</h2>
  448. <p>
  449. The parser for Lua source code treats numeric literals with the
  450. suffixes <tt>LL</tt> or <tt>ULL</tt> as signed or unsigned 64&nbsp;bit
  451. integers. Case doesn't matter, but uppercase is recommended for
  452. readability. It handles both decimal (<tt>42LL</tt>) and hexadecimal
  453. (<tt>0x2aLL</tt>) literals.
  454. </p>
  455. <p>
  456. The imaginary part of complex numbers can be specified by suffixing
  457. number literals with <tt>i</tt> or <tt>I</tt>, e.g. <tt>12.5i</tt>.
  458. Caveat: you'll need to use <tt>1i</tt> to get an imaginary part with
  459. the value one, since <tt>i</tt> itself still refers to a variable
  460. named <tt>i</tt>.
  461. </p>
  462. <br class="flush">
  463. </div>
  464. <div id="foot">
  465. <hr class="hide">
  466. Copyright &copy; 2005-2011 Mike Pall
  467. <span class="noprint">
  468. &middot;
  469. <a href="contact.html">Contact</a>
  470. </span>
  471. </div>
  472. </body>
  473. </html>