변수에 대한 읽기 전용 액세스에 매크로를 사용할 수 있습니까?
-
02-07-2019 - |
문제
일반 변수에 액세스하는 매크로를 정의 할 수 있지만 읽기 전용 방식으로 (기능을 호출하는 것으로 정의하는 것 외에)를 정의 할 수 있습니까? 예를 들어, 다음 코드의 값 매크로를 dostuff () 함수가 컴파일 오류를 일으키는 방식으로 정의 될 수 있습니까?
struct myobj {
int value;
}
/* This macro does not satisfy the read-only requirement */
#define VALUE(o) (o)->value
/* This macro uses a function, unfortunately */
int getvalue(struct myobj *o) { return o->value; }
#define VALUE(o) getvalue(o)
void dostuff(struct myobj *foo) {
printf("The value of foo is %d.\n", VALUE(foo)); /* OK */
VALUE(foo) = 1; /* We want a compile error here */
foo->value = 1; /* This is ok. */
}
해결책
변수가 항상 숫자 인 경우 다음이 작동합니다.
#define VALUE(x) (x+0)
또는 당신의 모범의 맥락에서
#define VALUE(x) (x->value+0)
다른 팁
좋아, 나는 하나를 생각해 냈다 :
#define VALUE(o) (1 ? (o)->value : 0)
C 표준 (C99 & C1X)의 §6.5.17을 참조하십시오.“쉼표 운영자는 lvalue를 산출하지 않습니다.”
#define VALUE(x) (0, x)
(C ++에게는 휴대용이 아닙니다.)
노력하다
#define VALUE(o) (const int)((o)->value)
이것은 퍼즐입니까 아니면 엔지니어링 작업입니까? 엔지니어링 작업이라면 C에서 구조의 불투명도를 얻는 더 좋은 방법이 있습니다. 이 블로그 기사, 나는 C에서 그것을하는 방법에 대한 충분한 설명을 썼습니다.
제휴하지 않습니다 StackOverflow