做到专业,应该是每个职业程序员应该要求自己做到的。BSD爱好者乐园_#i+V
C&mC,U(s 让我们看看lua是怎么写头文件的。Wh!HN7mWdfbBSD爱好者乐园J:M)BA!nj"U
1.License AgreementBSD爱好者乐园7gq)ocw't-G License
Agreement应该加在每个头文件的顶部。BSD爱好者乐园3B FHP#~(~ Lua
Sample:BSD爱好者乐园)]6E u2p:se BSD爱好者乐园#ab*JguM!Mx K
T9Q^6RI1_/* 3?"g"X@ KG?5Cr** $Id: lua.h,v 1.175b 2003/03/18
12:31:39 roberto Exp $ xas;` Oh**
Lua - An Extensible Extension Language AK1|p5^7?e5|b~**
Tecgraf: Computer Graphics Technology Group, PUC-Rio, Brazil !J!yqJEq4f(F~z3L**http://www. mailto:info@BSD爱好者乐园:|
YN4r'|Et ** See Copyright Notice at the end of this fileBSD爱好者乐园0@
O"J#fYX */ ;m:cy"L?N[(g,u BSD爱好者乐园E
p0~.p1Q@ h*}
BSD爱好者乐园1\)fO/|y q
2.guard
defineBSD爱好者乐园v
Uyv'W
\{}b
g 整个头文件应该在guard define之间BSD爱好者乐园
@K*PPk}Y
)j}8v$qmC8dBSD爱好者乐园x }:eo$E*V"j #ifndef lua_hBSD爱好者乐园+c3Q:LMT/G #define lua_h
C6TX5PF,VBSD
爱好者乐园pCJK4w&kL
#endif VF;hL6[F2J? 另
外,如果这个头文件可能给c++使用,要加上
$tV)A`oyBSD爱好者乐园)nUOeC3F
;L1D'lt?y8qd#ifdef __cplusplus +[Q
Eo.w/X)Mextern "C" { qU.v$X-^I
D2Q#endifBSD爱好者乐园5Xk"dB:Cn}R
pn /*The lines within extern "C" */
KA
o^eGYBSD爱好者乐园
ovZry%h$r
BF\+`-vh_+w/m#ifdef
__cplusplusBSD爱好者乐园
IC|ox$V
F2_ } :[~8ip6|$S!V4GY#endifBSD爱好者乐园.\.jH9f2SK
BSD爱好者乐园v ~;K\RZ7w
3.尽量不要在头文件中暴露数据结构
UXy{mBSD
爱好者乐园~j
R4ov+P
这样可以用户对你的实现的依赖,也减少了用户的编译时间
|/Ul_,_,[,Z!qw'r
2T)JE s,Q#\(m F/y)W
\v._typedef struct lua_State lua_State; 6tcR/T
zu?cn,Y)^LUA_API lua_State *lua_open (void);BSD爱好者乐园X5`:U-P&yL LUA_API
void lua_close (lua_State *L);BSD爱好者乐
园7C2l8m1f)goa6g
P|6n9L0iQ[2I,M 可
以看到虽然用户会一直使用lua_State,但是并不知道lua_State的结构是什么BSD
爱好者乐园}9n2f!T.E_O
BSD爱好者乐园c
y4i
yv
从一个使用lua的例子程序可以看出:
c-k;W,n8i`(f
Z?Y)Adeo~ BSD爱好者乐园a|uP[6V&R)D1Oy #include "lua.h" ERkvz _$di"[#include "lauxlib.h" n1_'D&@ROv[+S~mt#include
"lualib.h"BSD爱好者乐园Q3w&n
LG+P
3u[4Q!d!Gd BSD爱好者乐园z k$O8g$W int main(int argc,
char *argv[]) w8rKz5vU7r{BSD爱好者乐园U}
m Xn"|xK?` lua_State *L = lua_open(); 9e/]q"t6g|a"hc%? const char *buf =
"var = 100";BSD爱好者乐园`
F3M[Z~ ? int var ;BSD爱好者乐园
b[
R9Oy9EG6g luaopen_base(L);BSD
爱好者乐园MlN.z~z
YR luaopen_io(L);BSD爱好者乐园
2{6L)T?iUe2nu2{tk lua_dostring(L, buf);BSD爱好者乐园p0P"yL#u?W$S2s
lua_getglobal(L, "var");BSD爱好者乐园
R(D&f1p,G }y)vCn7F var = lua_tonumber(L, -1); 5}l`1i+yqw J lua_close(L);BSD爱好者乐园}4@I2][7a return 0; {9iF
\'nOL,W}
5\;MH&YU$h^W/KWBSD爱好者乐园 _.Zh3RH%N,v N1BX
Ex-eaBp:b:a&\2M9e4.函数声明前
加XXX_API已利于拓展BSD爱好者乐园9Jew|h&y`
BSD爱好者乐园#F0jEbq?RE
Lua的例子
)G/J?C4E+qBSD
爱好者乐园:W)[5l&}|/o7m
|
BSD爱好者乐园j#`(D%g4Z&@[
h,O+I #ifndef LUA_API
Q"zI:G6s
hBSD爱好者乐园3{O_6^P
#define
LUA_API extern
'qCp/d
|a1pBSD爱好者乐园 _:wD+w%k7b%ZS
#endif
k `aVGIBSD
爱好者乐园$Mp
}BJC+bAy,c']i?
i'MpT
owBSD爱好者乐园/c3DAC*sK;_
LUA_API
lua_State *lua_open (void);
N1vh.D!?DRf6svBSD爱好者乐园#FQ `-`"~^+Q,R.@
CH1oTzVH|m)|CBSD爱好者乐园.P4L4P:U-@T/`
如果定义了LUA_API就是给
LUA内部使用的BSD爱好者乐园5r(b(II"kVL3n.wm
/uT1`NW6yk%Gb8z j如果没定义LUA_API就是for
user 的BSD爱好者乐园N#N#f;bej
BSD爱好者乐园L@I0b"U4[$\
写Window
dll程序经常会用到 2ne;s
D z{
H#Z
u:OY)oG(bEBSD爱好者乐园3nl;w
};p4v2N
#ifdef DLLTEST_EXPORTS
~?{}2`#X\~$R,_
$KL;h2r-q{}|#define DLLTEST_API
__declspec(dllexport)
4{.t"?/??u)cJ!r(s
p'Kfz1^.M#elseBSD爱好者乐园,T
m2k't7b7^$x
g
BSD爱好者乐园F%x9g la hI
#define
DLLTEST_API __declspec(dllimport)BSD爱好者乐园
4IV8E-H
LU*D
7p};bY;l#endifBSD爱好者乐园Y7?Q]@(@:jQ-u
Big&?
q*zd
fY)J
cf`BSD爱好者乐园Y?A$t)]q0\5iL
5.
宏的定义
0S8az3S"KRBSD爱好者乐园Cvo&h.RXS)i G
尽量使用括号来包住
所定义的对象
-e0@!cC6r"YBSD爱好者乐园KeG YwTe6I
BSD爱好者乐园:Zez~4B
TA?'SR
Xp.K#define LUA_TNONE (-1)BSD
爱好者乐园NiO?`D
1b5n)g#g0}/@
!x6iG9_7U5BJ
~/_8PlBSD爱好者乐园M0W`?k7b
#define
lua_register(L,n,f) \
s@WbQ
c
/D'QO7a3d
[Vf$Z (lua_pushstring(L, n), \BSD爱好者乐园?X/cVphs
\sx1}Av1gS
W,jp lua_pushcfunction(L, f), \
p6a9TY+W DSMBSD爱好者乐园E8P
sYF {%H6B:g
lua_settable(L, LUA_GLOBALSINDEX)) ]
Hk+a_o4z BSD爱好者乐园!Z{;w.k};SM
BSD爱好者乐园 rl?P?C]"@5m*X
6.目录结构BSD爱好者乐园o[:p*LZ7m
t;B1a[f:L`一般应该使用一个单独的include目录来包含要发布的头
文件,但不应该把内部使用的头文件包含进去。BSD爱好者乐园y?G7c
y+A,nxw+k&e.Y
BSD爱好者乐园j4?
]{!B%Y&u9p
Lua 的 include目录只包含了三个头文件
N^"N#QL4C*q/P]
gOMikr%q/N/C/alauxlib.h , lua.h, lualib.hBSD爱好者乐园e2_BG,oc
m#Uh
Q#kes7R?Q-r非常简
洁
|