헤드 업 : 이상한 질문입니다.조건부 매크로 확장
일부 로깅을 간소화하기 위해 내가 사용하기를 좋아하는 매크로가 있습니다. 예를 들어 Log(@"My message with arguments: %@, %@, %@", @"arg1", @"arg2", @"arg3")
을 수행하면 self
, _cmd
, __FILE__
, __LINE__
등을 포함하는보다 복잡한 메소드 호출로 확장되어 로깅되는 위치를 쉽게 추적 할 수 있습니다. 이것은 잘 작동합니다.
이제 매크로를 확장하여 Objective-C 메서드뿐만 아니라 일반적인 C 함수도 사용할 수 있도록 확장하고 싶습니다. 문제는 매크로 확장에있는 self
및 _cmd
부분입니다. 이 두 매개 변수는 C 함수에 없습니다. 이상적으로 C 함수 내에서 동일한 매크로 집합을 사용할 수 있기를 원하지만 문제가 발생합니다. (예를 들어) 내 Log()
매크로를 사용하면 self
및 _cmd
에 대한 컴파일러 경고가 표시됩니다 (총칭 함).
내 첫번째 생각은 다음 (내 매크로)처럼 뭔가를했다 :
if (thisFunctionIsACFunction) {
DoLogging(nil, nil, format, ##__VA_ARGS__);
} else {
DoLogging(self, _cmd, format, ##__VA_ARGS__);
}
을이 전체 경우() 문의 결과로, 매크로 대신에 치환되기 때문에 여전히 컴파일러 경고를 생성합니다 self
및 _cmd
키워드로 오류가 발생합니다 (함수 실행 도중에 실행되지는 않지만).
나의 다음 생각은 (내 매크로)이 그런 짓을했다 :
if (thisFunctionIsACFunction) {
#define SELF nil
#define CMD nil
} else {
#define SELF self
#define CMD _cmd
}
DoLogging(SELF, CMD, format, ##__VA_ARGS__);
불행히도 작동하지 않습니다. 나는 "error : '#'매크로 팩터가 뒤 따르지 않는다."라고 내 첫 번째로 말하면 #define
입니다.
제 생각에 다른 두 번째 매크로 집합은 특히 C 함수에서 사용하기위한 것입니다. 나쁜 냄새가 나는 냄새가 나는데 정말로은 이것을 원하지 않습니다.
Objective-C 메서드와 C 함수 내에서 동일한 매크로 집합을 사용할 수 있습니까? 매크로가 Objective-C 메서드 인 경우 self
및 _cmd
만 참조 할 수 있습니까?
편집 자세한 내용은 :
thisFunctionIsACFunction
은 아주 초보적인 방법으로 결정된다 (그리고 나는 개선 및 제안을 확실히 열려있어). 기본적으로이 : 씁니다 컴파일러의 동작에 의존하는 것
BOOL thisFunctionIsACFunction == (__PRETTY_FUNCTION__[0] != '-' && __PRETTY_FUNCTION__[0] != '+');
에 '-'또는 '+'목표 - C 개체의 인스턴스와 클래스 메소드. C 함수는 '-'또는 '+'로 시작하는 이름을 가질 수 없으므로 다른 함수는 C 함수 여야합니다.
__PRETTY_FUNCTION__
은 char*
으로 바뀌므로이 검사는 기술적으로 런타임 검사임을 이해합니다. 이는 아마도 도움 요청에 대한 주요 장애물 일 것입니다.
를 사용할 수 있습니까? – Artelius
@Artelius는 (는) 더 많은 정보를 가지고 질문을 편집했습니다. –