分享

如何写出专业的C头文件

 启_明_星 2010-04-09
做到专业,应该是每个职业程序员应该要求自己做到的。BSD爱好者乐园_#i+V C&mC,U(s
让我们看看lua是怎么写头文件的。 Wh!HN7mWdfbBSD爱好者乐园J:M)BA!nj"U

1.License AgreementBSD爱好者乐园7g q)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!yqJ Eq4f(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$qm C8dBSD爱好者乐园x }:eo$E*V"j
#ifndef lua_hBSD爱好者乐园+c3Q:L MT/G
#define lua_h

C6TX5P F,VBSD 爱好者乐园pCJK4w&kL

#endif
VF;hL6[F2J? 另 外,如果这个头文件可能给c++使用,要加上

$tV)A`oyBSD爱好者乐园)nUOe C3F


;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!V4G Y#endifBSD爱好者乐园.\.jH9f2SK

BSD爱好者乐园v ~;K\RZ7w

3.尽量不要在头文件中暴露数据结构

UXy{mBSD 爱好者乐园 ~j R4o v+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[])
w8r K z5vU7r{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+yq w J    lua_close(L);BSD爱好者乐园 }4@I2][7a
    return 0;
{9iF \'nOL,W}

5\;MH&YU$h^W/KWBSD爱好者乐园 _.Zh3RH%N,v N1B X

 
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 }B JC+bAy,c']i?

 

i'MpT o wBSD爱好者乐园/c3DAC*sK;_

LUA_API lua_State *lua_open (void);

N1vh.D!? D Rf6svBSD爱好者乐园#FQ `-`"~^+Q,R.@

 

CH1oTz VH|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程序经常会用到
2n e;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 YwT e6I

 BSD爱好者乐园:Zez~4B

TA?'SR Xp.K#define LUA_TNONE       (-1)BSD 爱好者乐园N iO?`D

1b5n)g#g0}/@ 

!x6iG9_7U5B J ~/_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非常简 洁

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多