아니요, 이식 가능한 방법은 없습니다. 다시 말하지만, #pragma를 사용하는 이식 가능한 방법은 전혀 없습니다. 이 때문에 많은 C / C ++ 컴파일러는 pragma와 유사한 작업을 수행하기위한 자체 메서드를 정의하고 종종 매크로에 포함 할 수 있지만 모든 컴파일러에 대해 다른 매크로 정의가 필요합니다. 그 길을 갈 의향이 있다면, 종종 다음과 같은 일을하게됩니다.
#if defined(COMPILER_GCC)
#define Weak_b
#define Weak_e __attribute__((weak))
#elif defined(COMPILER_FOO)
#define Weak_b __Is_Weak
#define Weak_e
#endif
#define DEFINE_DELETE_OBJECT(type) \
Weak_b void delete_ ## type_(int handle) Weak_e; \
Weak_b void delete_ ## type(int handle) Weak_e;
GCC와 같은 일부 컴파일러는 속성을 유형 서명에 추가로 추가하고 MSC와 같은 일부는 접두사로 추가하기 때문에 정의 Weak_b
하고 Weak_e
시작 및 끝 브라케팅 구문 으로 정의 하고 싶은 경우가 명확하지 않은 경우 (또는 적어도 MSC를 사용한 지 몇 년이 지났습니다.) 브라케팅 구조를 사용하면 전체 유형 서명을 컴파일러 구조로 전달해야하는 경우에도 항상 작동하는 것을 정의 할 수 있습니다.
물론, 원하는 속성없이 이것을 컴파일러로 이식하려고한다면, 할 수있는 일은 없지만 매크로를 확장하지 않고 코드가 계속 실행되기를 바랍니다. 순전히 경고하거나 pragma를 최적화하는 경우 가능성이 있습니다. 다른 경우에는 그렇게 많지 않습니다.
아, 그리고 실제로 Weak_b와 Weak_e를 매개 변수를 사용하는 매크로로 정의해야한다고 생각하지만,이 예제를 위해 약한 정의를 만드는 방법에 대한 문서를 읽으려고하지 않았습니다. 나는 그것을 독자를위한 연습으로 남겨둔다.