Sử dụng C library trong C++ | CppDeveloper

Khi lập trình với C + +, đôi lúc tất cả chúng ta cần sử dụng thư viện có sẵn viết bằng C. Các thư viện có sẵn này hoàn toàn có thể được phân phối dưới dạng source code ( những thư viện open source ) hoặc dưới dạng binary gồm có file thư viện đi kèm với những file header ( open source hoặc closed source ). Và yếu tố ở đây là nếu cứ để thế mà dùng thì trong source C + + mà call đến hàm ở source C thì sẽ không được ( compile sẽ lỗi ) .
Vì vậy trong bài này mình sẽ hướng dẫn anh em cách để có thể dùng được C library trong C++.

Giả sử chúng ta có có file header Sample.h như sau →

1

voiddoSomething();

Vì vậy trong bài này mình sẽ hướng dẫn đồng đội cách để hoàn toàn có thể dùng được C library trong C + +. Giả sử tất cả chúng ta có có file header Sample. h như sau →Chúng ta có khai báo của một hàm có tên là doSomething, hàm này được implement trong file Sample. c như sau →

1234567

# include ” Sample. h “

#include

voiddoSomething()

{

printf(” doSomething “);

}

#include

như sau →

1234567

# include ” Sample. h “

intmain()

{

doSomething();

return

0

;

}

1

errorLNK2019:unresolvedexternalsymbol” void __cdecl doSomething ( void ) “(?doSomething@@YAXXZ)referencedinfunction_main

Tiếp tục, tất cả chúng ta có 1 chương trình C + + với file main.cpp cónhư sau → Build chương trình này sẽ xảy ra lỗi compile kiểu như sau ( bên dưới là ví dụ build trên VS2015 ) →Nguyên nhân ở đây là ở quá trình linking những object với nhau thì compiler đang hiểu hàm doSomething là hàm C + + và tìm kiếm hàm này, mặc dầu hàm này có trong file object Sample. o tuy nhiên do Sample. c có đuôi. c nên nó được compiler biên dịch theo C convention. Trong khi đó compiler cứ mải tìm kiếm hàm doSomething theo C + + convention, tác dụng là compiler tìm không ra dẫn đến lỗi linking .

Để giải quyết vấn đề này thì chúng ta cần thêm extern

“C”

vào header file như sau →

123456789

# ifdef __cplusplus

extern” C “{

# endif

voiddoSomething();

# ifdef __cplusplus

}/ * end of ” extern C ” block * /

# endif

extern “C”, nhờ đó compiler sẽ hiểu rằng doSomething là hàm C. Done ! Mọi chuyện đã được giải quyết êm.
Để xử lý yếu tố này thì tất cả chúng ta cần thêmBây giờ khi Sample. h được include vào trong file C + + thì nó sẽ được đặt trong block, nhờ đó compiler sẽ hiểu rằng doSomething là hàm C. Done ! Mọi chuyện đã được xử lý êm .— Phạm Minh Tuấn ( Shun ) —