C에 대해 한가지 아쉬운점..

ㅡ,.ㅡ;;의 이미지

종종 느끼는것이
전처리에서 구조체의 맴버명을 직접쓰지않고 구조를 어떻게든 사용할방법이 없나는것이다

예를들어

typedef struct
{
int a;
int b;
} AB;

일때 STMEMBER( AB, 0 ) 는 a 로 대치될수 있게 해줬으면하는바램이..
AB ab;

ab.STMEMBER(AB, 1) <= ab.b 와 같은것
으로 사용하고 싶은..ㅎㅎ 또한 변수의 타입을 가져올방법도 같이 있어줬으면 좋겠다. sizeof() 는 있는데 typeof()도 ...

나만 그런가..

죠커의 이미지

동감합니다.

특히 typeof는 더 동감합니다. sizeof를 이용해서 불안정하게 형을 확인할려는 트릭들은 typeof의 필요성을 더 강조해준다고 생각합니다.

sizeof를 통해서 컴파일러는 이미 데이터의 형을 다 인수분해하고 있는데 왜 typeof를 추가 안 시키고 있는지 모르겠습니다.

crimsoncream의 이미지

#include <stdio.h>
#include <stdlib.h>

#define STMEMBER(ST, STT, IDX) *((STT##IDX *)(((char *)(&(ST))) + STT##_idx[(IDX)]))

#define AB0 int
#define AB1 char
#define AB2 int

typedef struct AB
{
  int a;
  char b;
  int c;
} AB;

static int AB_idx[] = {
  (int) &(((AB *) NULL)->a),
  (int) &(((AB *) NULL)->b),
  (int) &(((AB *) NULL)->c)
};

int
main ()
{
  AB ab = { 10, 'z', 2 };

  printf ("%d, %c, %d\n", STMEMBER (ab, AB, 0),
          STMEMBER (ab, AB, 1), STMEMBER (ab, AB, 2));

  return 0;
}

말씀하신것과는 좀 다른 모양이지만 기능은 대충 가능하지 않을까 싶어서 만들어 봤는데요. structure를 정의할때 <structure name>_idx라는 array와 <structure name><index>로 된 type 정보를 가진 마크로만 있으면 동작할 것 같은데. 맞나요?

그리고 typeof가 rtti 형태로 제공된다면 언어에 내장된 feature로 정의되는 것보단 간단한 프레임웍 형태로 있다면 도움이 될 것 같군요.

오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.

ㅡ,.ㅡ;;의 이미지

crimsoncream wrote:
#include <stdio.h>
#include <stdlib.h>

#define STMEMBER(ST, STT, IDX) *((STT##IDX *)(((char *)(&(ST))) + STT##_idx[(IDX)]))

#define AB0 int
#define AB1 char
#define AB2 int

typedef struct AB
{
  int a;
  char b;
  int c;
} AB;

static int AB_idx[] = {
  (int) &(((AB *) NULL)->a),
  (int) &(((AB *) NULL)->b),
  (int) &(((AB *) NULL)->c)
};

int
main ()
{
  AB ab = { 10, 'z', 2 };

  printf ("%d, %c, %d\n", STMEMBER (ab, AB, 0),
          STMEMBER (ab, AB, 1), STMEMBER (ab, AB, 2));

  return 0;
}

말씀하신것과는 좀 다른 모양이지만 기능은 대충 가능하지 않을까 싶어서 만들어 봤는데요. structure를 정의할때 <structure name>_idx라는 array와 <structure name><index>로 된 type 정보를 가진 마크로만 있으면 동작할 것 같은데. 맞나요?

그리고 typeof가 rtti 형태로 제공된다면 언어에 내장된 feature로 정의되는 것보단 간단한 프레임웍 형태로 있다면 도움이 될 것 같군요.

일단 Lib 작성한다치면 사용자가 인덱스배열과 멤버타입정의를 일일이 해주는 불편함이 생기는군요...

또 위에 코드를 보면서생각난건데 제가 제시한것도 마찬가지문제가 있는데
매크로 함수로 for 문을 돌릴수 없는문제가 있군요..

#for 전처리와 구조체맴버의 갯수를 구하는 전처리가 있어야겠군요..


----------------------------------------------------------------------------