ตัวแปรอินไลน์สามารถเปลี่ยนแปลงได้หลังจากการเริ่มต้นใน C ++ 17 หรือไม่


11

สถานการณ์ของฉันเป็นดังต่อไปนี้ (มันทำงานในเสียงดังกราว แต่ไม่ได้อยู่ใน gcc)

liba.hpp:

inline int MY_GLOBAL = 0;

libother.cpp: (dll)

#include "myliba.hpp"

void myFunc() {
    //
    MYGLOBAL = 28;
}

someexe.cpp:

RunAppThatUsesBothLibAandLibOther();

ปัญหาคือตัวแปรอินไลน์แสดง 0 ในสถานที่ที่ฉันคาดไว้ 28 เพราะมันถูกแก้ไขอย่างมากในเวลาทำงาน MSVC ไม่เห็นด้วยกับสิ่งนี้ แต่เสียงดังทำตามที่ฉันคาดไว้

คำถามคือ: สามารถแก้ไขตัวแปรอินไลน์ในเวลาทำงานในสถานการณ์ของฉันได้หรือไม่ (ฉันแก้ไขปัญหาโดยการลบตัวแปรออกไป)

คำตอบ:


10

ใช่inlineตัวแปรสามารถแก้ไขได้หลังจากการเริ่มต้น

อย่างไรก็ตาม DLLs เป็นสิ่งที่แปลกใน Windows ที่มี MSVC หากต้องการการประมาณอย่างใกล้ชิด DLL แต่ละตัวจะถูกจำลองเป็นโปรแกรม C ++ ของตัวเองพร้อมรันไทม์อิสระทั้งหมด ดังนั้นจึงมีสำเนาของinlineตัวแปรหนึ่งตัวสำหรับโปรแกรมหลักและอีกหนึ่งสำเนาสำหรับ DLL


1
caveat emptor ที่คล้ายกัน: การเชื่อมโยง lib แบบคงที่เดียวกันเข้ากับ DLLs สองอัน (ซึ่งคุณลิงก์กับโปรแกรมเดียวกัน) จะสร้างสำเนาของตัวแปร lib แบบคงที่ทั้งหมดสองชุด
Max Langhof

นี่แปลว่าฉันต้องใช้ตัวแปรที่ไม่ใช่แบบอินไลน์ ถูกต้องหรือไม่ อย่างน้อยในกรณีของ dll หลายตัวที่ฉันต้องการแชร์ค่าเปลี่ยนไปที่ runtime ...
Germán Diago

1
ใช่คุณจะต้องใช้inlineตัวแปรที่ไม่ใช่ คุณจะต้องตรวจสอบให้แน่ใจว่าพวกเขาถูกส่งออกจาก DLL หนึ่งและนำเข้าจากที่นั่นในที่อื่น ๆ ทั้งหมด
Anthony Williams
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.