cht電腦資訊LanguageC/C++
adm Find login register

GCC C++ vs Visual Studio C++

eliu

joined: 2007-08-09
posted: 11480
promoted: 617
bookmarked: 187
新竹, 台灣
1subject: GCC C++ vs Visual Studio C++Promote 0 Bookmark 02009-06-11quote  

在 gcc C/C++ 裡面,我們可以dynamic allocate local variable (stack memory)。 例如

char gy[a+b];

 a,b 是variable

Visual Studio 2008 C++  還不行。只好用 new delete 去 allocate/free memory。

如果預估的 maximum size 不是很大,乾脆寫成 constant,省得麻煩。

stack size 一般只有幾 mega 而已,是可以用 ulimit -s 設定, 不要把 stack 操爆了。如果你 stack 設定很大,那 heap memory 就變小了。

$ ulimit -a

...
stack size              (kbytes, -s) 8192
 

edited: 5
eliu

joined: 2007-08-09
posted: 11480
promoted: 617
bookmarked: 187
新竹, 台灣
2subject: Promote 0 Bookmark 02009-06-14quote  

UTF-8 > 128 中文 string const 在 Visual C++ 2008 不支援,只好轉成用 \ 的方式,是用小程式 print 出來的。  Visual C++ 對有中文的 .cpp也可以用 UTF-8 儲存。如果用UTF-16 儲存 size 就變成兩倍。

 

char *pho_chars[]={
#if UNIX
    "   ㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙ【】、",
    "   ㄧㄨㄩ",                                           // 2
#else
"   \xe3\x84\x85\xe3\x84\x86\xe3\x84\x87\xe3\x84\x88\xe3\x84\x89\xe3\x84\x8a\xe3\x84\x8b\xe3\x84\x8c\xe3\x84\x8d\xe3\x84\x8e\xe3\x84\x8f\xe3\x84\x90\xe3\x84\x91\xe3\x84\x92\xe3\x84\x93\xe3\x84\x94\xe3\x84\x95\xe3\x84\x96\xe3\x84\x97\xe3\x84\x98\xe3\x84\x99\xe3\x80\x90\xe3\x80\x91\xe3\x80\x81",
"   \xe3\x84\xa7\xe3\x84\xa8\xe3\x84\xa9",
#endif
};

edited: 3
eliu

joined: 2007-08-09
posted: 11480
promoted: 617
bookmarked: 187
新竹, 台灣
3subject: Promote 0 Bookmark 02009-06-15quote  

Visual Studio C++ 2008 是用 .cpp 開頭的  ef bb bf 這個 zero-width UTF-8 character 的來辨識 file 是否是 UTF-8 的 file。Visual Studio 稱此為 UTF-8 signature (UTF-8 簽章),當 file 沒有此 UTF-8 signature(UTF-8 簽章) 就無法正確讀取 UTF-8 的中文。如果 file 沒有 UTF-8 signature,也可以用 notepad open 然後 save。

GCC 4.4 就支援 UTF-8 signature,< 4.4會造成 errors。

edited: 3
caleb
joined: 2007-09-22
posted: 630
promoted: 134
bookmarked: 90
4subject: Promote 0 Bookmark 02009-06-15quote  

eliu
Visual Studio 稱此為 UTF-8 signature,

M$ 一貫都用此愚蠢的東西判定是否 UTF-8,但實際上 UTF-8 是完全不需要 Byte-order mark 的。

事實上,在 UTF-8 檔案裡加入 BOM 絕對是 bug,只不過所有的 win32 都預設使用此 bug,而且遇到沒 bug 的檔案還認不出來。

ychao
joined: 2007-10-25
posted: 298
promoted: 21
bookmarked: 3
5subject: Promote 0 Bookmark 02009-06-16quote  
eliu

UTF-8 > 128 中文 string const 在 Visual C++ 2008 不支援,只好轉成用 \ 的方式,是用小程式 print 出來的。  Visual C++ 對有中文的 .cpp也可以用 UTF-8 儲存。如果用UTF-16 儲存 size 就變成兩倍。

UTF-8跟UTF-16存中文的size是一樣的吧?只有英數字才有三倍的差別?

本人已不在此站活動

joined: 2007-09-19
posted: 4946
promoted: 325
bookmarked: 206
歸隱山林
6subject: Promote 0 Bookmark 02009-06-16quote  

ychao
UTF-8跟UTF-16存中文的size是一樣的吧?只有英數字才有三倍的差別?

不是吧?UTF-8 是 1-6 byte 的 multiple byte charater encoding,UTF-16 是一個或多個固定 16 bit 的 wide character encoding。一般來說,中文的話,應該是 UTF-16 較省空間。

所以,UTF-8 才會沒有 endian 的問題,而 UTF-16 有。


eliu

joined: 2007-08-09
posted: 11480
promoted: 617
bookmarked: 187
新竹, 台灣
7subject: Promote 0 Bookmark 02009-06-16quote  
我的意思是 .c .cpp file主要還是以 ascii english( 1 byte) 為主,UTF-8 中文(2-4byes)只是很小一部份,如果用 UTF-16(2 or 4 bytes)儲存,應該可視為 file size 變成兩倍。
edited: 1
本人已不在此站活動

joined: 2007-09-19
posted: 4946
promoted: 325
bookmarked: 206
歸隱山林
8subject: Promote 0 Bookmark 02009-06-16quote  

eliu
我的意思是 .c .cpp file主要還是以 ascii english( 1 byte) 為主,UTF-8 中文(2-4byes)只是很小一部份,如果用 UTF-16(2 or 4 bytes)儲存,應該可視為 file size 變成兩倍。

是的,我知道。我是針對  ychao 回應的。英文佔絕大多數的話,當然 utf8 較不佔空間(1 byte vs. 2 bytes)。


edited: 1
eliu

joined: 2007-08-09
posted: 11480
promoted: 617
bookmarked: 187
新竹, 台灣
9subject: Promote 1 Bookmark 12009-06-17quote  

很不幸的,即使有 UTF-8 signature,Visual Studio 2008 C++ compiler 依然會把 const string literal 變成 Big5,目前找不到解法。

只好用 _(L"中文")

_()  是一個自己定義 UTF-16 轉 UTF-8 的 function

不過在 Linux 端 _() function call 會造成 size 變大一些,gcc 沒有此問題,所能不用 _() 最好

如果定義

#define L ""

應該可以避掉此問題?

edited: 2
caleb
joined: 2007-09-22
posted: 630
promoted: 134
bookmarked: 90
10subject: Promote 0 Bookmark 02009-06-17quote  

用 _() 可能和 i18n 的 _() 衝突,建議用 __() 或是別的啥的。

雖然看起來只用在 fixed string,似乎和 i18n 無關 (gcin i18n 目前沒翻譯一些寫死的字串,例如"全/半"之類的)

eliu
#define L ""

萬一不行反正還有
#if UNIX
#else
#endif

可以用。

eliu

joined: 2007-08-09
posted: 11480
promoted: 617
bookmarked: 187
新竹, 台灣
11subject: Promote 0 Bookmark 02009-06-17quote  

caleb
用 _() 可能和 i18n 的 _() 衝突,建議用 __() 或是別的啥的。

如果要分開就不能共用了

反正 _() 是 macro, 也可以用 #if  定義你要的。

caleb
joined: 2007-09-22
posted: 630
promoted: 134
bookmarked: 90
12subject: Promote 0 Bookmark 02009-06-17quote  

所有 string 都變成 _(L"foo") 了?

反正 win32 應該也不需要 i18n,那還是用 _() 吧。

eliu

joined: 2007-08-09
posted: 11480
promoted: 617
bookmarked: 187
新竹, 台灣
13subject: Promote 0 Bookmark 02009-06-29quote  

原本想用

#define L ""

的方式。不過在 gcc 上無法使用這個方式,最後只好變成

_(_L("中文")),看起來很醜,都是 Visual Studio 害的。_(_L()) 也可以合併簡化變成裏面也同時把 UTF-16 轉成 UTF-8,以後再說。

L ## x 的用法是從 Win32 tchar.h 挖出來的,看那個 _T(x) 學來的。## 意思好像是接起來的意思。 

#if WIN32
#define _L(x)      L ## x
#else
#define _L(x) x
#endif

edited: 4
eliu

joined: 2007-08-09
posted: 11480
promoted: 617
bookmarked: 187
新竹, 台灣
14subject: Promote 0 Bookmark 02014-12-25quote  

eliu
原本想用

#define L ""

的方式。不過在 gcc 上無法使用這個方式,最後只好變成

_(_L("中文")),看起來很醜,都是 Visual Studio 害的。_(_L()) 也可以合併簡化變成裏面也同時把 UTF-16 轉成 UTF-8,以後再說。

L ## x 的用法是從 Win32 tchar.h 挖出來的,看那個 _T(x) 學來的。## 意思好像是接起來的意思。

在 Visual Studio/C++ 2010 SP1 有解了,這樣在 win32 使用 gtk 就更容易了。可以用

#pragma execution_character_set("utf-8")

指定 text 在 compile 時 string encoding 要用 UTF-8,不要弄成 ANSI,就可以避免 string 被轉成 big5。

cht電腦資訊LanguageC/C++
adm Find login register
views:53209