C ++ 17에서 초기화 후 인라인 변수를 변경할 수 있습니까?


11

내 시나리오는 다음과 같습니다 (clang에서는 작동하지만 gcc에서는 작동하지 않음)

liba.hpp :

inline int MY_GLOBAL = 0;

libother.cpp : (dll)

#include "myliba.hpp"

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

someexe.cpp :

RunAppThatUsesBothLibAandLibOther();

문제는 인라인 변수가 런타임에 과도하게 수정되어 28을 예상 한 위치에서 0을 표시한다는 것입니다. MSVC는 이에 동의하지 않지만 clang은 내가 기대하는 것을 수행합니다.

문제는 내 시나리오에서 런타임에 인라인 변수를 수정할 수 있습니까? (변수를 인라인하여 문제를 해결했습니다.)

답변:


10

예, inline초기화 후에 변수를 수정할 수 있습니다.

그러나 DLL은 Windows에서 MSVC가있는 이상한 것입니다. 근사치로, 각 DLL은 완전히 독립적 인 런타임을 가진 자체 C ++ 프로그램으로 모델링됩니다. 따라서 inline주 프로그램에 대한 변수 사본 과 DLL에 대한 사본이 있습니다 .


1
비슷한 주의 사항 : 동일한 정적 lib를 두 개의 DLL에 연결하면 (동일한 프로그램과 연결) 모든 정적 lib 변수의 사본 두 개가 생성됩니다.
— 맥스 랭 호프

이것은 인라인이 아닌 변수를 사용해야한다는 것을 의미합니다. 이 올바른지? 적어도 런타임에 변경된 값을 공유하려는 여러 dll의 경우 ...
— Germán Diago

1
예, inline변수가 아닌 것을 사용해야 합니다. 또한 하나의 DLL에서 내보내고 다른 모든 위치에서 가져 왔는지 확인해야합니다.
— Anthony Williams
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.