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.