頁:
[1]
關於C語言的 struct (已解決)
本帖最後由 在那裡 於 2017-1-13 07:53 PM 編輯struct body {
int x,y;
void set(int X, int Y) {x=X; y=Y;} //error
struct body *next;
};
typedef struct body BODY;
BODY head , body , v = {1,0} , cookie; // v 移動向量
head.next = &body; //error
body.next = NULL; // error
int main()
{
return 0;
}
他一直跳出 error: expected ':', ',', ';', '}' or '__attribute__' before '{' token| 錯誤行數為標上error註解的我不大明白究竟錯在哪兒
有大大可以幫我指明嗎?
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><div></div> 你用 C 還是 C++ compiler?
C 本身沒有引進物件導向的概念, 不能定義 member function
而你第三行正好定義了 set() 這個 body 的 member function
之後的兩個 error 都是在 function 之外寫程式碼, 應該要寫到 main() 裡頭 在非 function 包含 main(), 之外只能宣告, 或 assign init value (非 member)
所以如 inunu 所講,
head.next = &body; //error <-- head.next 已經是在操作 head 的member了
body.next = NULL; // error
請移到 main() 內
至於 void set(), c++才支援 method, 所以請把你的附檔名從 .c 改成 cpp
如果是Linux, gcc 自動會 call g++ 來 compile cpp.
另外你上面 return 寫成 retrun 了
本帖最後由 在那裡 於 2017-1-18 06:46 PM 編輯
哦哦
原來如此!
移動main狀況就解除了,檔名改成cpp後set的錯誤也消失了,
謝謝!
補充內容 (2017-1-18 06:45 PM):
懂了
不可以在函式或main以外的區域進行運算(除了宣告時)
不過.cpp那方面我是覺得有點奇怪
因為我看過有人用.c的檔名,可裡面卻進行跟我一樣動作
重點是編譯還過關了...... 在那裡 發表於 2017-1-13 07:52 PM static/image/common/back.gif
哦哦
原來如此!
移動main狀況就解除了,檔名改成cpp後set的錯誤也消失了,
你的struct直能用來declare種類int,char,double等等<br><br><br><br><br><div></div> 本帖最後由 chevylin0802 於 2017-6-4 11:05 AM 編輯
在函式外是可以指定初始值的
在C語言來說這種情形相當常見
尤其是Linux kernel/drivers的程式碼裏可以說是最常見不過的事情
只是指定初始值的方式有它一定的遊戲規則
比如 head.next = &body 這種做法就不允許
對於結構的初始值化是要一個整體的一起進行的
在C裏的說法是結構裏的元素(element)而不能說結構裏的成員(member)
因為C語言並沒有物件的觀念
但在C++來講, 結構裏的元素都被稱作結構裏的成員
如果要以C的觀點來講的話
那麼還是應該以元素來稱呼會比較妥善
結構裏的元素也有限制
函式是不允許被直接定義在結構裏面的
只有函式的指標可以放進去struct body {
int x,y;
void set(int X, int Y) {x=X; y=Y;} //error
struct body *next;
};
typedef struct body BODY;
在C語言裏是錯誤的宣告方式
正確的宣告方式如下struct _body {
int x,y;
(void*)(*set)(int x, int y, struct _body *myself);
struct _body *next;
};
typedef struct _body BODY;
void set(int x, int y, struct _body *myself) {
myself->...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div> chevylin0802 發表於 2017-6-4 10:50 AM static/image/common/back.gif
在函式外是可以指定初始值的
在C語言來說這種情形相當常見
尤其是Linux kernel/drivers的程式碼裏可以說是 ...
這種寫法完全可以使用C來編譯, 不需要把檔名改成.cpp
樓主的寫法完全可以用 C++ 來編譯,不需要修改任何程式碼
而且樓主的問題明明就在 global scope 不能有那兩個 statement
你也要去扯用 C 來模擬物件導向
扯 linux kernel,扯 driver
實在是很無言……
補充內容 (2017-6-13 12:25 PM):
我在跟你講你搞錯問題重點了,你還要來跟我扯C有沒有比較低階,扯我主管…我到底該哭還是該笑啊………...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div> 之後你可以檢查你的編譯環境 有時候只是哪邊沒設定好
要不然你可以試試網路上的c++ shell 可以線上編譯 如果可以執行 代表只是你的環境出問題
頁:
[1]