변수에 대한 읽기 전용 액세스에 매크로를 사용할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/140825

  •  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에서 그것을하는 방법에 대한 충분한 설명을 썼습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top