2014-03-24 122 views
0

我通常聲明在Oracle-PRO * C/C++通過的typedef結構陣列與一個字符數組作爲成員爲結構

VARCHAR myvar[25]; 

可變的我的文件更改預編譯後喜歡這個

typedef struct { unsigned short len; unsigned char arr[1]; } VARCHAR; 
struct { unsigned short len; unsigned char arr[25]; } myvar; 

由於類型定義,給出了varchar當我們使用varchar myvar[25]聲明,

  1. 爲什麼它不會創建結構數組myvar[25]
  2. 如何在第二行將typedef語句中的arr[1]更改爲arr[25]
+0

1)'myvar':重複名稱。 – BLUEPIXY

+0

@BLUEPIXY對不起。我無法捕捉到你 –

回答

1

從預編譯的代碼中你表現,我會說,

VARCHAR myvar[25]; 

這樣解釋SQL

myvar varchar(25) 

這也是產生什麼,注意char arr[25]

struct { unsigned short len; unsigned char arr[25]; } myvar; 
+0

如果它真的想解釋你上面說過的話。最後需要什麼'typedef struct {unsigned short len;無符號字符arr [1]; } VARCHAR; '。請澄清。我想知道是否有這樣的C中的任何概念。如果它是預編譯器的工作,則不存在問題 –

+1

我不知道,'VARCHAR' typedef的用途是什麼。在C中,當你分配動態內存時,你可以使用這樣的最小類型定義。你可以說'p = malloc(sizeof(VARCHAR)+ 14)',它給你一個堆大小爲14的varchar。但是由於我既沒有編寫預編譯器,也沒有編寫預編譯器的文檔,所以我不能肯定地說。 –

1
  1. myvar是一個對象,它爲字符myvar.arr[25]和字符串長度myvar.len保留數組的內存。它還需要什麼?
  2. 這可能是一個struct hack。我猜想它被用來創建一個通用的VARCHAR指針。

實施例:

void PrintVarChar(VARCHAR * vcPtr) { 
    for(unsigned short i; i < vcPtr->len; ++i) { 
     PrintChar(vcPtr->arr[i]); 
    } 
} 

調用這樣的:

PrintVarChar((VARCHAR*)&myvar); 
+0

struct hack很有趣......但它似乎是未定義的行爲。oracle預編譯器如何使用未定義的行爲? –

+0

嗯,我沒有說這是一個很好的和可移植的練習:)爲什麼Oracle使用它?只有他們可以告訴。 – user694733