推荐给好友 上一篇 | 下一篇

const与数组声明

BSD爱好者乐园C-Ie5[.t!~%c

在libidn的stringprep.h里面,有这样的声明BSD爱好者乐园{ V;BtN3`{8}

BSD爱好者乐园Z*s7xH?&R@

view plaincopy to clipboardprint?
d`^/KfVu1extern IDN_DLL_VAR const Stringprep_profiles stringprep_profiles[];  
F"Ae u_1extern IDN_DLL_VAR const Stringprep_table_element stringprep_rfc3454_A_1[]; 
l icbg;jJ1extern IDN_DLL_VAR const Stringprep_profiles stringprep_profiles[];
iN3M Kh8B^|b1extern IDN_DLL_VAR const Stringprep_table_element stringprep_rfc3454_A_1[];BSD爱好者乐园 I#hj6VJoJ

BSD爱好者乐园)if1qA0X B

声明的实现在c文件里面,例如profiles.cBSD爱好者乐园Ki.o;A3~9E;i!D

BSD爱好者乐园"^7pTip

view plaincopy to clipboardprint?BSD爱好者乐园,e;|1~1oB5f ^1R+A2k7q U
Stringprep_profiles stringprep_profiles[] = {   
*@y q h"P'B*\1  {"Nameprep", stringprep_nameprep},   BSD爱好者乐园;?b4hP^~%u~D2Sz
  {"KRBprep", stringprep_kerberos5},    /* Deprecate? */   BSD爱好者乐园]gb(p"w2R
  {"Nodeprep", stringprep_xmpp_nodeprep},   BSD爱好者乐园"n?K$k3a:j|
  {"Resourceprep", stringprep_xmpp_resourceprep},   
M%y8VpB hB}u1  {"plain", stringprep_plain},    /* sasl-anon-00. */   BSD爱好者乐园 ]7uX4M`N"C"R
  {"trace", stringprep_trace},    /* sasl-anon-01,02,03. */   BSD爱好者乐园 AU$C?4q;~SS!n{
  {"SASLprep", stringprep_saslprep},   BSD爱好者乐园%E3b/Dk#Iy
  {"ISCSIprep", stringprep_iscsi},    /* Obsolete. */   BSD爱好者乐园%?g0X tJ qg
  {"iSCSI", stringprep_iscsi},    /* IANA. */   BSD爱好者乐园M\5Yd2p'f
  {NULL, NULL}   
hSU'j:n1}; BSD爱好者乐园'L'L9C9sMp#u8U&Vc J.Y
Stringprep_profiles stringprep_profiles[] = {
|R)G"t K$Qk1  {"Nameprep", stringprep_nameprep},
V&q(U@ D1  {"KRBprep", stringprep_kerberos5},    /* Deprecate? */BSD爱好者乐园3c ?db"Y&]B
  {"Nodeprep", stringprep_xmpp_nodeprep},BSD爱好者乐园D5kzt7NH$c*FM"H
  {"Resourceprep", stringprep_xmpp_resourceprep},
o? E5f ~1  {"plain", stringprep_plain},    /* sasl-anon-00. */
*p D6Xd9_T G1  {"trace", stringprep_trace},    /* sasl-anon-01,02,03. */
%x8z7o5H @&o8\&l M1  {"SASLprep", stringprep_saslprep},
aS9i+D,b7|7y.]_1  {"ISCSIprep", stringprep_iscsi},    /* Obsolete. */BSD爱好者乐园1@tosrR
  {"iSCSI", stringprep_iscsi},    /* IANA. */
ha:w;c#b:BI1  {NULL, NULL}BSD爱好者乐园} `,n x u+Gi'g
};BSD爱好者乐园5t9C#O*L Q

BSD爱好者乐园YBf&hQ?C3i(J

libidn是可以在vs里面编译通过的,我有一个c++项目要用libidn,但在编译时会报错,

O,xe7D p7B*D1BSD爱好者乐园au#gb ZL zL1P(@

error C2133: 'stringprep_profiles' : unknown size

\D#Xy|'ry2wb4Io1BSD爱好者乐园)Eo D#`A$YC*l

在MSDN里面,对error C2133的说明为:http://msdn.microsoft.com/en-us/library/c13wk277(VS.71).aspxBSD爱好者乐园n&[&Mu'd/N%D-W

;RZxpj4e0uj1An unsized array is declared as a member of a class, structure, union, or enumeration. The /Za (ANSI C) option does not allow unsized member arrays.BSD爱好者乐园&S7p \~0t8mN2Z f

BSD爱好者乐园dc Wb6O

The following sample generates C2133:BSD爱好者乐园3o wU&dU} |

"YY+sXj2QN_7t1// C2133.cpp
;Y5[sn'an1// compile with: /Za
A1R~M#?!s]1struct X
:N.tmx/M&~1{BSD爱好者乐园G @Ke!u8B3~
   int a[0];   // C2133, unsized arrayBSD爱好者乐园8BR0B8gF.[
};BSD爱好者乐园6u B-C/{tY3d

glF7[dO Hp1int main()BSD爱好者乐园aUR)A,z:mD.]+yXG9Xx
{BSD爱好者乐园Bi+t#pW
}BSD爱好者乐园}#AjS*G h_

]%_'qG C2U1如果你将stringprep.h的数组声明改为:

LN,qJRxI+K1BSD爱好者乐园({ nV&n FR&^A;k

extern IDN_DLL_VAR const Stringprep_profiles* stringprep_profiles;BSD爱好者乐园!|3g*q3\E

;Z'm^kH1extern IDN_DLL_VAR const Stringprep_table_element* stringprep_rfc3454_A_1;

n$Zi,JAT1

6f*rYL O2Z(G$~1可以编过,但运行时是错误的,stringprep_profiles指向的0x00000003。BSD爱好者乐园4`(s6O2HMA

BSD爱好者乐园ti[;^Cz

这是为什么呢?不至于要将所有的数组都指定大小吧。BSD爱好者乐园8ci|'B*h$`

H.}#OY)nIB1先看一个简化的例子,下面的例子是可以编过的,并且运行正常

Oc@:`4nZz Y;g,R1BSD爱好者乐园%hY.fS%X;N

view plaincopy to clipboardprint?
#\n`J1@$Fd1//f:\My Documents\Visual Studio 2008\Projects\TestProject\ArrayStruct\ArrayDefine.h  BSD爱好者乐园Q"DQgvI$}C
#pragma once  
(BOla q @ \1#ifdef __cplusplus   
:@;]#Oe6} DH+iw1extern "C"   
;|4}8P w,@,Z1{   BSD爱好者乐园%r7f] iAg/c9E
#endif  BSD爱好者乐园5P+I8Y3uO5d-w
typedef struct{   BSD爱好者乐园3Q'S NAQ%vD(L8M
     int i;   
i+Z3[+q5js1     int j;   BSD爱好者乐园E$Bz,DA&T*jhk,A
} A;  BSD爱好者乐园/[7c!M A[-_znjU
//const A test[];   
#u$jnhl1A test[];  BSD爱好者乐园Gj:P&n)W/yw1c/U[V
#ifdef __cplusplus   
:S+f CZa{|z1}   
*q.Y I X~1#endif BSD爱好者乐园'g#r!d|"f`u
//f:\My Documents\Visual Studio 2008\Projects\TestProject\ArrayStruct\ArrayDefine.hBSD爱好者乐园P4md%?.Vs4b#d#a
#pragma once
I |cx,gie1#ifdef __cplusplus
_p ~$\H bl1extern "C"BSD爱好者乐园-^ `{zRQ
{
@\@ I3}*s1#endifBSD爱好者乐园~5M}W X2a's)Z-e
typedef struct{BSD爱好者乐园H9QS,C!SF
     int i;
0gjn%x0[q1     int j;BSD爱好者乐园|n^i X
} A;BSD爱好者乐园K1u6Y.O&C0J
//const A test[];
1Bln(`EV4q1A test[];BSD爱好者乐园(d)[%A1V-}.y$a._.nG
#ifdef __cplusplus
&N#BX9b1V)L1}
$v!Rs Iygv1#endif

JY%kTy{1BSD爱好者乐园'[F e#C-Z D/_RIc p

view plaincopy to clipboardprint?BSD爱好者乐园YG xL{4g7gRQm
//f:\My Documents\Visual Studio 2008\Projects\TestProject\ArrayStruct\ArrayDef.c  BSD爱好者乐园N,_'gQ[X*L
#include "ArrayDefine.h"  
3l(U*lM#l I(z1//const A test[]=   BSD爱好者乐园 uk*E-D @d\0[fF
A test[]=   BSD爱好者乐园&G2H2D[.]xWo\P%F
{   
4Y/A)A/kf}z1    {   BSD爱好者乐园0q/F|4m @Lo&Z
        1,2   BSD爱好者乐园 U)L c.SV Tx
    },   BSD爱好者乐园)G$K&P:SO3R k;h(v
    {   
|.N]j ];hR~1        3,4   BSD爱好者乐园G%E8N8x1Qj'FU6W
    }   
,CN%B/o/GE,L1}; 
fwG}qK%[1//f:\My Documents\Visual Studio 2008\Projects\TestProject\ArrayStruct\ArrayDef.c
Ce$M V.g5CTj6t1h+Z)M1#include "ArrayDefine.h"BSD爱好者乐园p&c9Z%f5B E1~HOM
//const A test[]=
6on+KU(fVIb+N1A test[]=
g%G$`B-{~ h1{
/Z7F8n]PG1    {BSD爱好者乐园0k(Bt6z,M2nG.ek
        1,2
v W.A)zRlM1    },BSD爱好者乐园h)\YKG?o0S"l
    {
.`a(u}B.?`1        3,4
,|fM HC7UI5]D1    }BSD爱好者乐园Qp$y&h5p(q5Y&G,u
};

w s9g-|u(w#^d AC1

w x8czjvR1view plaincopy to clipboardprint?
d(y!JX~M [}m2A A1//f:\My Documents\Visual Studio 2008\Projects\TestProject\ArrayStruct\ArrayStruct.cpp  
HZ;J l1H Y(sS;H1#include "stdafx.h"   
1n W1{1p!u)z)zluW1#include "ArrayDefine.h"  
xk{+bcz&\c1int _tmain(int argc, _TCHAR* argv[])   BSD爱好者乐园&\I9f8T#Nb
{   
lw+J5kcFc;F+w1    printf("%d,%d\n",test[0].i,test[0].j);   
x5Aq+i?;q8Ad2fD1    return 0;   
{-j NHcv!j1BSD爱好者乐园{v6X }v3n
//f:\My Documents\Visual Studio 2008\Projects\TestProject\ArrayStruct\ArrayStruct.cpp
+of[d?+e1#include "stdafx.h"
6W!e ~)Gqh1#include "ArrayDefine.h"
b1l ]q&s+c E1int _tmain(int argc, _TCHAR* argv[])
G$R"| P/Rc1{
V!wb;SD({J_.?1    printf("%d,%d\n",test[0].i,test[0].j);BSD爱好者乐园1| U~1IA
    return 0;BSD爱好者乐园itu$W+aGz
}

Iub_0l~$L:a5V1

B}X\D1如果在数组前面加一个const,如注释掉的语句,这时就会编译不过去。

$d3U2y3p v I `1

u ]\0]jsu5q1如果你加了const并且将ArrayStruct.cpp的文件名改为ArrayStruct.c也可以编过去并正常运行。BSD爱好者乐园:wEoij m;J

BSD爱好者乐园7Ea'x8p[-a&m T

通过上面的例子可以看出c++和c里面对const和数组声明的不同处理了。BSD爱好者乐园x"N [PH V/m


[重要提醒]对本篇资料有疑问,请到论坛讨论,尽量使文章准确无误>>>
[版权声明]BSD爱好者乐园站内文章,如来源不是互联网,则均系原创或翻译之作,可随意转载,或以此为基础进行演译,但务必以链接形式注明原始出处和作者信息,否则属于侵权行为。另对本站转载他处文章,俱有说明,如有侵权请联系本人,本人将会在第一时间删除侵权文章。
TAG: const 数组 声明
 

评分:0

我来说两句

seccode