การประกาศซ้ำเสียงดังกราว [bcc32c Warning] ไม่ควรเพิ่มแอตทริบิวต์ 'dllexport'

ฉันกำลังสร้าง DLL และส่งออกฟังก์ชัน SimpleMAPI DLL และหนึ่งในลายเซ็นของฟังก์ชันมีดังต่อไปนี้:

extern "C" ULONG __declspec(dllexport) WINAPI MAPISendMail(LHANDLE lhSession, ULONG_PTR ulUIParam, lpMapiMessage lpMessage, FLAGS flFlags, ULONG ulReserved);

ฉันใช้ C++ Builder โดยใช้คอมไพเลอร์เสียงดังกราว คำเตือนปัญหาคอมไพเลอร์:

[bcc32c Warning]: redeclaration of 'MAPISendMail' should not add 'dllexport' attribute mapi.h(262): previous declaration is here

มันรวบรวมและใช้งานได้ แต่ฉันกังวลกับคำเตือนนี้ สามารถหลีกเลี่ยงได้หรือไม่?


person Coder12345    schedule 24.04.2021    source แหล่งที่มา
comment
ตามที่คำเตือนกล่าวไว้ MAPISendMail() ได้รับการ ประกาศ ใน <mapi.h> แล้ว และคุณกำลังพยายาม ประกาศซ้ำ แตกต่างออกไป หากคุณต้องการ ใช้ SimpleMAPI คุณจะต้องรวม <mapi.h> แต่ถ้าคุณต้องการ ใช้งาน SimpleMAPI ไม่ต้องใส่ <mapi.h> คัดลอกการประกาศบางส่วนที่ฟังก์ชันของคุณต้องการ (lpMapiMessage ฯลฯ) ลงในโค้ดของคุณเอง ดูตัวอย่างนี้   -  person Remy Lebeau    schedule 25.04.2021
comment
@RemyLebeau ขอบคุณ - มันไม่ใช้งานง่าย แต่ฉันได้แก้ไขปัญหาแล้ว หากคุณต้องการทำให้สิ่งนี้เป็นคำตอบ โปรดทำ ถ้าไม่ ฉันจะสร้างคำตอบเองในภายหลัง   -  person Coder12345    schedule 25.04.2021


คำตอบ (1)


ดังที่ @RemyLebeau ชี้ให้เห็น คำเตือนเกิดขึ้นเพราะฉันรวมส่วนหัว ‹mapi.h› ไว้ด้วย

หากมีการสร้าง MAPI DLL (สร้าง DLL ของคุณเองที่โปรแกรมอื่นจะใช้หรือส่งออกฟังก์ชัน MAPI) ดังนั้นหากมีใครใช้การสนับสนุน MAPI ในโปรแกรมของตนเอง โครงสร้างที่จำเป็นและ #define จะถูกคัดลอกจากไฟล์ mapi.h ต้นฉบับไปยังแบบกำหนดเอง ไฟล์ส่วนหัวซึ่งรวมอยู่ด้วย #define เช่น FLAGS หรือ MapiMessage โครงสร้าง

หากมีการใช้ MAPI (เพื่อใช้การเรียกใช้ฟังก์ชัน MAPI จาก DLL อื่นหรือโปรแกรมอื่น) ‹mapi.h› ก็จะถูกรวมไว้ด้วย

ดังนั้นหลังจากสร้างไฟล์ mapidefs.h แบบกำหนดเองซึ่งมีเฉพาะโครงสร้างที่จำเป็นและ #define ปัญหาก็ได้รับการแก้ไขแล้ว

นอกจากนี้ยังมีตัวอย่างบน StackOverflow ด้วยเช่นกัน

person Coder12345    schedule 25.04.2021