, 당신은 신뢰성의 종류를 판별 할 수 없습니다 객체. 따라서 일반적인 프로그래밍을 지원하는 몇 가지 메커니즘을 도입해야합니다. 정보를 입력 유지하는 구조로 모든 개체를 둘러싸 :
enum {type_int, type_double, type_string, /* ... */ } type_t;
struct {
type_t type;
void *obj;
} generic_type;
을 지금, 당신은 ((generic_type)my_object).type
을 전환 할 수 있습니다. 이것은 아마도 당신이 찾고있는 것이 아닙니다.
그러나, 매크로 인수가 문자열 리터럴 또는 뭔가 다른 여부를 알 수있는 간단한 트릭이있다. 매크로 인용 문자 '#'를 사용하면 문자열로 매크로 인수를 설정할 수 있습니다 :
이
#define DEBUG(x) if (#x[0] == '"') printf("%s\n", x); else printf("%d\n", x)
는 이제 다음을 수행 할 수 아래쪽에
DEBUG("foo bar"); // prints "foo bar"
DEBUG(23); // prints "23"
을, 이것은 당신에게 못하게 예를 들어 구별하다 int
및 float
이다.또한, 포인터 - 투 - 문자는 문자열로 인식되지 않습니다 : 일부 시스템에
char *foo = "bar";
DEBUG(foo); // prints the value of foo, not the string pointed to by foo
double salary;
DEBUG(salary); // prints (int)salary, not (double)salary
, sizeof(double) != sizeof(int)
. 이것은 매크로 인자의 다른 유형을 더 구별하는 데 도움이 될 수 있지만 확실히 이식 가능하지는 않습니다.
일반적으로 완전히 또한 휴대 성을 유지하면서 일반적인 프로그래밍 지원을 향한 심각한 노력없이이 문제를 해결 할 수 없습니다, 말하기.
제 조언 : 형식 지정자를 사용하는 것뿐입니다. 대신 __VA_ARGS__
를 사용
'endl'을 사용 하시겠습니까? 그것은 프로그램을 정말로 느리게 할 흐름을 내뿜습니다. –
부수적으로, 함수와 같은 매크로 형식을 작성하는 경우 표준 표현은 전체 표현식을 괄호로 묶는 것입니다. – Lundin
@mattieu : 예, 그는'endl'을 사용하기를 원합니다 : 프로그램을 느리게하는 디버그에서. 그리고 : 프로그램이 그것을 실행하면서, 콘솔의 각 줄을보고 싶습니다. 플러시하지 않는다는 것은 : 방금 인쇄 한 것을 볼 때가 아니라는 것을 알 수 있습니다. 그건 디버깅을 방해합니다. – towi