伊莉討論區
標題:
關於C語言的 struct (已解決)
[打印本頁]
作者:
在那裡
時間:
2017-1-10 10:58 PM
標題:
關於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註解的我不大明白究竟錯在哪兒
有大大可以幫我指明嗎?
作者:
inunu
時間:
2017-1-11 03:04 AM
提示:
作者被禁止或刪除 內容自動屏蔽
作者:
scottcheng
時間:
2017-1-11 11:28 AM
在非 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-13 07:52 PM
本帖最後由 在那裡 於 2017-1-18 06:46 PM 編輯
哦哦
原來如此!
移動main狀況就解除了,檔名改成cpp後set的錯誤也消失了,
謝謝!
補充內容 (2017-1-18 06:45 PM):
懂了
不可以在函式或main以外的區域進行運算(除了宣告時)
不過.cpp那方面我是覺得有點奇怪
因為我看過有人用.c的檔名,可裡面卻進行跟我一樣動作
重點是編譯還過關了......
作者:
炽天使
時間:
2017-6-3 04:42 PM
在那裡 發表於 2017-1-13 07:52 PM
哦哦
原來如此!
移動main狀況就解除了,檔名改成cpp後set的錯誤也消失了,
你的struct直能用來declare種類int,char,double等等
作者:
chevylin0802
時間:
2017-6-4 10:50 AM
本帖最後由 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->x = x;
myself->y = y;
}
BODY body = { 0, 0, &set, NULL };
BODY head = { 1, 0, &set, body };
複製代碼
這種寫法完全可以使用C來編譯, 不需要把檔名改成.cpp
事實上這種以結構的方式的寫法來實現C程式的物件化在國外是相當常見的
不管是知名的ffmpeg, vlc, 還是xine, 都是採取這種方式來作為程式最主要的架構
全部都是用純C語言寫出來的但架構上採用物件方式
作者:
CoNsTaRwU
時間:
2017-6-13 11:55 AM
提示:
作者被禁止或刪除 內容自動屏蔽
作者:
coal511464
時間:
2017-8-2 11:35 PM
之後你可以檢查你的編譯環境 有時候只是哪邊沒設定好
要不然你可以試試網路上的c++ shell 可以線上編譯 如果可以執行 代表只是你的環境出問題
歡迎光臨 伊莉討論區 (http://1.eyny.com/)
Powered by Discuz!