Một biến nội tuyến có thể được thay đổi sau khi khởi tạo trong C ++ 17 không?


11

Kịch bản của tôi là như sau (nó hoạt động trong tiếng kêu nhưng không phải trong gcc)

liba.hpp:

inline int MY_GLOBAL = 0;

libother.cpp: (dll)

#include "myliba.hpp"

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

someexe.cpp:

RunAppThatUsesBothLibAandLibOther();

Vấn đề là biến nội tuyến đã hiển thị 0 ở những nơi tôi mong đợi 28 vì nó đã được sửa đổi trong thời gian chạy. MSVC không đồng ý với điều này, nhưng tiếng kêu làm điều tôi mong đợi.

Câu hỏi là: các biến nội tuyến có thể được sửa đổi trong thời gian chạy trong kịch bản của tôi không? (Tôi đã giải quyết vấn đề bằng cách khử nội dung biến.)

Câu trả lời:


10

Có, inlinecác biến có thể được sửa đổi sau khi khởi tạo.

Tuy nhiên, DLL là những thứ lạ trên Windows với MSVC. Với một xấp xỉ gần đúng, mỗi DLL được mô hình hóa như một chương trình C ++ của riêng nó, với thời gian chạy hoàn toàn độc lập. Do đó, có một bản sao inlinebiến của bạn cho chương trình chính và một bản khác cho DLL.


1
Tương tự emptor caveat : Liên kết cùng một lib tĩnh thành hai DLL (mà sau đó bạn liên kết với cùng một chương trình) sẽ tạo ra hai bản sao của tất cả các biến lib tĩnh.
Max Langhof

Điều này có nghĩa là, tôi đoán rằng tôi phải sử dụng các biến không nội tuyến. Điều này có đúng không? Ít nhất là trong trường hợp có nhiều dll mà tôi muốn chia sẻ một giá trị đã thay đổi trong thời gian chạy ...
Germán Diago

1
Có, bạn sẽ cần sử dụng các inlinebiến không . Bạn cũng cần đảm bảo rằng chúng được xuất từ ​​một DLL và được nhập từ đó ở tất cả các nơi khác.
Anthony Williams
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.