2012-04-25 19 views
8

Praca na obliczanie średniej geometrycznej wartości w tablicyBłąd: „oczekiwany«(»przed ciągiem stałym”

Funkcja powinna obliczyć geo myśli poprawnie, ale jestem coraz dziwny komunikat o błędzie

#include <stdio.h> 
#include <stdint.h> 
#include <math.h> 


extern "C" 

double geomean(double myarray[], int count)  ////error here, expected '(' before string constant 
{ 
double geomean = 1; 
double root = (1/(double)count);  
int i; 
for(i = 0; i < count; i++) 
    { 
     geomean = geomean * myarray[i]; 
    } 
geomean = pow(geomean, root); 
return geomean; 
} 
+0

Co dziwne mieszanka C++ i C; dlaczego nie wybrać jednego języka? – sarnold

+0

Jestem rzeczywiście "nowy" w kodowaniu w C – user1050632

+0

Aha, to ma sens. :) I przepraszam za brakujący błąd inline w kodzie. Westchnienie. – sarnold

Odpowiedz

23

extern "C" nie jest prawidłowy C (to jest ważne tylko w C++), po prostu usuń go, jeśli pracujemy w czystym C

-3

pierwsza linia powinna być. extern C;

Inną opcją byłoby deklarując c poza głównym funkcji bez słowa kluczowego extern ...

+8

Nie, nie powinno. Oznaczałoby to niewykorzystaną zmienną C z niejawnym int (który jest przestarzały). – Jens

2

mam odpowiedzi na to pytanie, starając się pokryć, które mogłyby zostać ujęte w bardziej szczegółowej odpowiedzi na pomoc pytającego lub inne osoby odwiedzając tę ​​stronę.

Error: “expected '(' before string constant”

Jak wspomniano w innej odpowiedzi na swoje pytanie, extern "C" nie jest prawidłowy C (to jest ważne tylko w C++). Możesz go usunąć, jeśli używasz tylko czystego C.

Jednakże, jeśli ty (lub ktoś inny) ma mieszankę plików źródłowych C i C++, możesz użyć makra __cplusplus. __cplusplus zostanie zdefiniowane makro dla każdej jednostki kompilacji, która jest uruchamiana przez kompilator C++. Ogólnie oznacza to pliki .cpp i wszelkie pliki dołączane przez ten plik .cpp.

Tak więc to samo .h (lub .hh lub .hpp lub co-masz-ty) może być interpretowane jako C lub C++ w różnych momentach, jeśli różne jednostki kompilacji je uwzględniają. Jeśli chcesz, aby prototypy w pliku .h odwoływały się do nazw symboli C, to muszą mieć zewnętrzne "C", gdy są interpretowane jako C++, i nie powinny mieć zewnętrznego "C", gdy są interpretowane jako C (jak w twoim przypadku otrzymujesz błąd!).

#ifdef __cplusplus 
    extern "C" { 
#endif 

// Your prototype or Definition 
#ifdef __cplusplus 
    } 
#endif 

Note: All extern "C" does is affect linkage. C++ functions, when compiled, have their names mangled. This is what makes overloading possible. The function name gets modified based on the types and number of parameters, so that two functions with the same name will have different symbol names.

If you are including a header for code that has C linkage (such as code that was compiled by a C compiler), then you must extern "C" the header -- that way you will be able to link with the library. (Otherwise, your linker would be looking for functions with names like _Z1hic when you were looking for void h(int, char)).

Powiązane problemy