: ※ 發信站: 批踢踢實業坊(ptt.cc)
: ◆ From: 140.121.197.115
: ※ 編輯: loveme00835 來自: 140.121.197.115 (08/05 15:52)
: → xatier:陣列名稱可以想成是一個const char* 型的指標, 指向的位址 08/05 16:01
: → xatier:定不變 08/05 16:01
: → loveme00835:如果像一樓所說, 就太浪費陣列所包含的資訊了, 考慮 08/05 16:11
: → loveme00835:這段程式碼 : http://paste.plurk.com/show/288965/ 08/05 16:12
說到這個 讓我想到之前討論過的C99 VLA和C++的問題
如love大所說,應把array跟pointer當成不同型態(但array可轉型成pointer)
在C89(C90)之前array至少還有"array length"這個constant資訊
但在C99引進VLA後 故事似乎有些改變...
我曾經測試過VLA在g++上是可以使用的(大概是compiler自己實作的extension?)
也就是以下混合C++和C99的程式碼在g++是可以執行的
#include <iostream>
#include <algorithm>
int main(int argc, char *argv[])
{
int len = 3;
char a[len]; // VLA
a[0] = '0'; a[1] = '1'; a[2] = '2';
std::cout << *std::max_element(a,a+len);
}
不過由於C99的VLA違反了C++分別處理動態型別和靜態型別的設計理念
使得C99更難相容於C++...
以love大的這個程式為例
由於C99的改變,很明顯的下面程式就出了問題
#include <iostream>
template<typename T, int LEN>
void printarray(T (&array)[LEN])
{
for (int i = 0; i < LEN; ++i)
std::cout << array[i] << ' ';
}
int main(int argc, char *argv[])
{
int len = 3;
char a[len];
a[0] = '0'; a[1] = '1'; a[2] = '2';
printarray(a); //ERROR!!
}
compiler會抱怨:⊙皿⊙凸我找不到match的function啊!!
這時 我們應該回到過去C語言處理動態分配的方法
printarray(char *array, int const LEN);
也難怪C++的爸爸斥責C99一點也不顧慮C++的兼容性...( ′-`)y-~
(小弟只是新手,只是突然看到這種現像覺得挺有趣的
如有錯誤請各位前輩糾正及補充囉!)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.24.192.68
推
08/05 19:24, , 1F
08/05 19:24, 1F
→
08/05 20:58, , 2F
08/05 20:58, 2F
→
08/05 20:58, , 3F
08/05 20:58, 3F
→
08/05 21:00, , 4F
08/05 21:00, 4F
→
08/05 21:01, , 5F
08/05 21:01, 5F
→
08/05 21:02, , 6F
08/05 21:02, 6F
→
08/05 21:06, , 7F
08/05 21:06, 7F
→
08/05 21:11, , 8F
08/05 21:11, 8F
→
08/05 21:12, , 9F
08/05 21:12, 9F
感謝幫忙debug 其實是兩個XD
※ 編輯: hilorrk 來自: 114.24.192.68 (08/05 21:13)
推
08/05 23:04, , 10F
08/05 23:04, 10F
→
08/05 23:04, , 11F
08/05 23:04, 11F
→
08/05 23:17, , 12F
08/05 23:17, 12F
→
08/06 07:22, , 13F
08/06 07:22, 13F
→
08/06 12:41, , 14F
08/06 12:41, 14F
討論串 (同標題文章)