<QApplicationStatic>

Header: #include <QApplicationStatic>

매크로

(since 6.3) Q_APPLICATION_STATIC(Type, VariableName, ...)

상세 설명

매크로 문서

[since 6.3] Q_APPLICATION_STATIC(Type, VariableName, ...)

이 매크로는 ` Q_GLOBAL_STATIC `을 확장하여, ` QGlobalStatic` 유형의 전역 정적 객체를 생성합니다. 이 객체의 이름은 ` VariableName`이며, 가변 개수의 인자로 초기화되고, ` Type`을 가리키는 포인터처럼 동작합니다. 여기서 해당 유형의 실제 수명은 ` QCoreApplication`에 바인딩됩니다. Q_APPLICATION_STATIC으로 생성된 객체는 첫 사용 시 자체적으로 초기화되므로, 애플리케이션이나 라이브러리의 로딩 시간을 증가시키지 않습니다. 또한, 이 객체는 모든 플랫폼에서 스레드 안전하게 초기화됩니다.

Q_GLOBAL_STATIC 의 경우 타입이 프로그램 종료 시에만 소멸되도록 설계된 것과는 대조적으로, 여기서는 타입의 실제 수명이 QCoreApplication 의 수명에 연동됩니다. 이로 인해 QCoreApplication 가 소멸되면 함께 소멸되어야 하는 준정적(semi-static) QObject를 저장하는 데 이상적입니다. 즉, QCoreApplication 가 destroyed 신호를 발산하면 해당 타입이 삭제됩니다. 새로운 QCoreApplication 가 생성된 경우, 객체에 다시 액세스할 때 해당 객체가 재생성되는 것이 허용됩니다.

값은 ` QCoreApplication`에 바인딩되어 있으므로, 유효한 ` QCoreApplication::instance()`가 존재할 때만 이 객체에 접근해야 합니다. ` QCoreApplication `가 생성되기 전이나 소멸된 후에 이 객체에 접근하면 경고가 발생하며, 예측할 수 없는 동작이 나타날 수 있습니다.

이 매크로의 일반적인 사용법은 다음과 같으며, 전역 컨텍스트(즉, 어떤 함수 본문 밖)에서 사용됩니다:

Q_APPLICATION_STATIC(MyQObjectType, staticType, "some string", function())

이 매크로에 가변 개수의 인수로 전달된 인수는 객체가 생성될 때마다 평가되므로, 위 예제에서 객체가 재생성되면 function 함수가 한 번 이상 호출된다는 점에 유의하십시오.

값이 ` QCoreApplication`의 수명과도 연동된다는 점을 제외하면, 이 매크로는 ` Q_GLOBAL_STATIC()`와 동일하게 동작합니다. 자세한 내용은 해당 매크로의 문서를 참조하십시오.

스레딩 보장

Q_APPLICATION_STATIC 매크로는 여러 스레드가 객체에 동시에 접근을 시도하더라도, 객체가 ( QCoreApplication 의 수명 동안) 한 번만 초기화되도록 보장합니다. 이는 객체별로 뮤텍스를 제공함으로써 이루어집니다. 애플리케이션 및 라이브러리 개발자는 해당 객체가 이 뮤텍스가 잠긴 상태에서 생성된다는 점을 인지해야 하며, 따라서 동일한 객체의 초기화 과정에 재진입해서는 안 됩니다. 그렇지 않으면 교착 상태가 발생합니다.

객체의 소멸 시에는 스레드 안전성이 보장되지 않습니다. 즉, QCoreApplication 의 소멸자가 실행되기 시작하면 사용자 코드는 이 객체에 접근해서는 안 됩니다. 사용자 코드는 메인 스레드의 이벤트 루프가 종료된 후에는 객체에 접근하지 않는 등, 이러한 상황이 발생하지 않도록 조치를 취해야 합니다.

Q_GLOBAL_STATIC 와 마찬가지로, Q_APPLICATION_STATIC도 생성 완료 후 객체에 대한 액세스에 대해 스레드 안전성을 보장하지 않습니다. 경합이 발생할 수 있는 데이터 액세스가 일어나지 않도록 보장하는 것은 사용자 코드의 책임입니다.

이 작업으로 생성된 객체가 QObject 인 경우, 해당 객체와 연관된 스레드는 객체 생성에 성공한 스레드가 됩니다. 이 객체는 메인 스레드에 의해 소멸되므로, 소멸 전에 메인 스레드나 아무 스레드도 지정하지 않은 상태로 ` moveToThread()`를 호출하는 것이 권장됩니다. 메인 스레드가 객체를 초기화할 것이라고 보장할 수 없는 경우, 해당 클래스의 생성자에서 이를 수행하는 것이 합리적인 해결책입니다.

이 매크로는 Qt 6.3에서 도입되었습니다.

Q_GLOBAL_STATIC 와 QGlobalStatic도 참조하십시오 .

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.