Trên các máy Linux (và OS X) của tôi, iconv()
hàm có nguyên mẫu này:
size_t iconv (iconv_t, char **inbuf...
trong khi trên FreeBSD, nó trông như thế này:
size_t iconv (iconv_t, const char **inbuf...
Tôi muốn mã C ++ của mình được xây dựng trên cả hai nền tảng. Với trình biên dịch C, đi qua một char**
cho một const char**
tham số (hoặc ngược lại) thường phát ra một cảnh báo đơn thuần; tuy nhiên trong C ++, đó là một lỗi nghiêm trọng. Vì vậy, nếu tôi vượt qua a char**
, nó sẽ không biên dịch trên BSD và nếu tôi vượt qua a, const char**
nó sẽ không biên dịch trên Linux / OS X. Làm cách nào tôi có thể viết mã biên dịch trên cả hai mà không cần cố gắng phát hiện nền tảng?
Một ý tưởng (thất bại) mà tôi có là cung cấp một nguyên mẫu cục bộ ghi đè bất kỳ nguyên mẫu nào được cung cấp bởi tiêu đề:
void myfunc(void) {
size_t iconv (iconv_t, char **inbuf);
iconv(foo, ptr);
}
Điều này không thành công vì iconv
cần liên kết C và bạn không thể đặt extern "C"
trong một hàm (tại sao không?)
Ý tưởng hoạt động tốt nhất mà tôi nghĩ ra là truyền chính con trỏ hàm:
typedef void (*func_t)(iconv_t, const char **);
((func_t)(iconv))(foo, ptr);
nhưng điều này có khả năng che giấu các lỗi khác, nghiêm trọng hơn.