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)
).
Co dziwne mieszanka C++ i C; dlaczego nie wybrać jednego języka? – sarnold
Jestem rzeczywiście "nowy" w kodowaniu w C – user1050632
Aha, to ma sens. :) I przepraszam za brakujący błąd inline w kodzie. Westchnienie. – sarnold