2011-07-16 99 views
0

這裏給出的代碼在由g ++編譯時運行良好,但是在使用gcc編譯時出錯。顯然,這是對C++正確而不是C.請幫我糾正語法C.C和C++之間的區別

# include <stdio.h> 
typedef struct demo 
{ 
    int arr[20], i; 
    void setvalue(int num) 
    {for(i=0;i<20;i++)arr[i]=num;} 

    void printvalue() 
    {for(i=0;i<20;i++)printf("%d ",arr[i]);} 
} example; 

int main() 
{ 
    example e; 
    e.setvalue(100); 
    e.printvalue(); 
    return 0; 
} 

錯誤日誌:

stov.c:7:2: error: expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’ before ‘{’ token 
stov.c: In function ‘main’: 
stov.c:18:3: error: ‘example’ has no member named ‘setvalue’ 
stov.c:19:3: error: ‘example’ has no member named ‘printvalue’ 
+1

問這樣的問題時告訴我們是什麼錯誤這將是很好。 – Bart

+7

你的空間吧打破了嗎?你的輸入鍵有點狡猾嗎? –

+4

我沒有低估這個,但我理解那些做過的人:C和C++根本不同,你的問題沒有道理;你基本上是問「我做了X,爲什麼不是不相關的Y工作?」你會期望你的代碼在Pascal編譯器上工作嗎?在JavaScript中?在Haskell中?當然不是。那麼爲什麼它應該在C中工作? C和C++的常見,不合理的混合真的很乏味。 –

回答

10

你不能在C方法(該功能在結構中)。有解決這個方法不止一種,但我會簡單地傳遞對象作爲第一個參數功能:

void setvalue(struct demo *d, int num) 
{ 
    int i; 
    for(i = 0; i < 20; i++) 
     d->arr[i] = num; 
} 


/* ... */ 
setvalue(&e, 100); 
+1

你也不能在C++中有方法。 (會員功能) –

+5

@Cory,當然可以嗎?成員函數是C和C++之間最大的區別之一...... – bdonlan

+6

@bdonlan:我認爲Cory是挑剔的,並指出在C++中,方法被稱爲*成員函數,這是一個有效的點,但不是實際上有用。 :) –

2

這是你的問題:你struct包含的方法。這是在C

沒有好

在C++中struct大多是像class(或者更確切地說,一個class大多是像struct),並且可以有方法等

在C,這並不適用。

1

您可以使用struct中的函數指針來模擬OOP。

typedef struct demo 
{ 
    int arr[20], i; 
    void (*setvalue)(int num); 

    void (*printvalue)(); 
} example; 

然後你可以在函數指針中指定一個函數。

void set_val(int num) {for(i=0;i<20;i++)arr[i]=num;} 
example_struct.setvalue = set_val; 
0

我想指出的是C有函數指針和函數指針可以像C++成員函數一樣使用。使用一些C預處理器宏和模板可以避免笨重的語法(您可以使用C預處理器進行通用編程,它的功能更強大,功能更強大,然後C++模板可以更好地進行類型檢查和(在現代編譯器上)更快更小的代碼;此編程這個技巧曾經被Algol和COBOL程序員稱爲代碼書(我在青少年的COBOL課程中學到了它),但由於某種愚蠢的原因,C程序員已經避免了這種技巧)。沒有測試

代碼,只是拼湊一起從代碼中的問題:

# include <stdio.h> 
static void _setvalue(example *obj, int num) 
{ int i; 
    for(i=0;i<20;i++) 
     obj->arr[i]=num; 
} 

static void _printvalue(example *obj) 
{ int i; 
    for(i=0;i<20;i++) 
     printf("%d ", obj->arr[i]); 
} 


typedef struct demo 
{ int arr[20], i; 
    void (*const setvalue)(example *, int) = _setvalue; 
    void (*const printvalue)(example *) = _printvalue; 
} example; 

int main() 
{ example e; 
    e.setvalue(&e, 100); 
    e.printvalue(&e); 
    return 0; 
}