簡體   English   中英

C:如何確定外部數組的sizeof(array)/ sizeof(struct)?

[英]C: How to determine sizeof(array) / sizeof(struct) for external array?

定義類型x和該類型的數組X

XH:

typedef struct _x {int p, q, r;} x;
extern x X[];

單獨的文件保持巨大的鳴喇叭數組X

XC:

#include "x.h"
x X[] = {/* lotsa stuff */};

現在我想使用X

main.c中:

#include "x.h"

int main()
{
    int i;

    for (i = 0; i < sizeof(X)/sizeof(x); i++) /* error here */
        invert(X[i]);

    return 0;
}

main.c不會編譯; 錯誤是:

error: invalid application of ‘sizeof’ to incomplete type ‘struct x[]’

如何在沒有硬編碼的情況下獲得X的大小?

xh添加:

extern size_t x_count;

xc添加:

size_t x_count = sizeof(X)/sizeof(x);

然后在循環中使用變量x_count

除法必須在包含數組初始化程序的編譯單元中完成,因此它知道整個數組的大小。

如果可以在數組的末尾放置終止指示符,例如:

x X[] = {/* lotsa stuff */, NULL};

可能是數組中的元素數量無關緊要:

#include "x.h"

int main()
   {
   x *ptr = X;

   while(ptr)
      invert(ptr++);

   return 0;
   }

如果需要數組中的元素數,則也可以使用上述方法對元素進行計數。

這是使用復合文字的解決方案:

.h

typedef struct _x {int p, q, r} x;

#define LOTSA_STUFF        {1, 2, 3}, {4, 5, 7}
#define LOTSA_STUFF_SIZE  sizeof ((x[]) {LOTSA_STUFF})

extern x X[LOTSA_STUFF_SIZE];

.c

x X[LOTSA_STUFF_SIZE] = {LOTSA_STUFF};

對於.c的定義,您甚至可以做得更好並使用靜態斷言( STATIC_ASSERT定義是作為讀者的練習;):

x X[] = {LOTSA_STUFF};

STATIC_ASSERT(sizeof X != LOTSA_STUFF_SIZE, "oops, sizes are not equal");

你不能這樣做。 但是你可以提供一種獲得尺寸的方法。

此外

extern x X[];

extern size_t xArraySize;

或者,最好是,

extern size_t xArraySize(void);

xh

xc定義它。

將你的循環改為:

for (i = 0; i < xArraySize(); i++)
    invert(X[i]);

如果你只是包含xh,編譯器不知道X的實際大小是多少。 只是看着xh,就沒有辦法猜測。 您必須使用大小聲明X:

extern x X[15];

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM