บนเครื่อง Linux (และ OS X) ของฉันiconv()
ฟังก์ชั่นมีต้นแบบนี้:
size_t iconv (iconv_t, char **inbuf...
ในขณะที่ FreeBSD จะมีลักษณะดังนี้:
size_t iconv (iconv_t, const char **inbuf...
ฉันต้องการให้โค้ด C ++ ของฉันสร้างบนทั้งสองแพลตฟอร์ม ด้วยคอมไพเลอร์ C การส่งผ่านchar**
สำหรับconst char**
พารามิเตอร์ (หรือในทางกลับกัน) มักจะส่งเสียงเตือนเท่านั้น อย่างไรก็ตามใน C ++ เป็นข้อผิดพลาดร้ายแรง ดังนั้นถ้าฉันผ่าน a char**
มันจะไม่รวบรวมบน BSD และถ้าฉันส่งผ่านconst char**
มันจะไม่คอมไพล์บน Linux / OS X ฉันจะเขียนโค้ดที่คอมไพล์ทั้งสองอย่างโดยไม่ต้องพยายามตรวจจับแพลตฟอร์มได้อย่างไร
แนวคิด (ล้มเหลว) อย่างหนึ่งที่ฉันมีคือการจัดเตรียมต้นแบบท้องถิ่นที่แทนที่ส่วนหัวที่ให้มา:
void myfunc(void) {
size_t iconv (iconv_t, char **inbuf);
iconv(foo, ptr);
}
สิ่งนี้ล้มเหลวเนื่องจากiconv
ต้องการการเชื่อมโยง C และคุณไม่สามารถใส่extern "C"
ในฟังก์ชันได้ (ทำไมไม่?)
แนวคิดในการทำงานที่ดีที่สุดที่ฉันคิดคือการส่งตัวชี้ฟังก์ชันเอง:
typedef void (*func_t)(iconv_t, const char **);
((func_t)(iconv))(foo, ptr);
แต่สิ่งนี้อาจปกปิดข้อผิดพลาดอื่น ๆ ที่ร้ายแรงกว่าได้