C나 C++에서 자주 쓰는 for loop을 #define으로 정의해서 써본 적이 있는 사람 저 말고 또 있나요?

dl3zp3의 이미지

옛날에 C++를 한창 배우던 시절에

#define FOR(x,n)  for(int x=0;x<(n);x++) 

위와 같은 정의를 즐겨쓰곤 했습니다. for (int x =0, x<(n), x++)를 항상 다써주기가 귀찮아서...

그리고 SUM과 MAX라는 메크로도 정의해서 쓰곤 했는데, 예를 들어 FOR와 SUM을 같이 써서

SUM(FOR(i,n), a[i], sum)

는 C전처리기를 거쳐서

sum = 0;
for(int i = 0; i< n; i++){
  sum += a[i]
}

가 되도록 정의했습니다.

자주 쓰는 for loop의 형태에 따라서 FOR, FOR1, FOR2등을 정의하고, 이것을 SUM, MAX, MIN, PRODUCT과 필요할 때마다 같이 쓰곤 했습니다.

sDH8988L의 이미지

매크로 닥질은 정말 무궁무진하고 사람에 따라 정말 많이 다르지요...

제가 본 최고의(최고로 다양하게 쓰는) 매크로는 SimpleScalar라는 CPU Core Simulator 였습니다...

CPU의 각 OPCODE들이 해야 하는 일을 거의 매크로로 정의해 놓았는데, 거의 머... 지옥입니다...

컴퓨터 아키텍처를 공부하는 학생들에게는 축복의 시뮬레이터지만, OPCODE를 변경하는 건 최대한 자제해야죠...ㅋㅋㅋ

그런데, 저렇게 매크로를 짜두면(언어가 지원하는 간단한 문법들에 대해서) 다른 사람이 보기 힘들어 하지 않던가요?

혼자 쓰는 프로그램이라면야 상관없지만, 매크로 만날 때마다, 저게 뭔지 파악하기 위해서 찾아보는 건 글쎄요...

같이 일하는 환경에서는 그다지 바람직하지는 않은 거 같은데요...

물론 제 의견입니다...

neocoin의 이미지

많은 곳에서 컨벤션을 이용해 for each형태로 실수를 줄여둔걸 관찰할 수 있었습니다.

제가 느낀 가장 안타까운 고생이 이런 형태입니다.

for(int i=0;i < max;i++);
{
  // algorighm.
}
kkb110의 이미지

openTTD소스코드에서 그런식으로 루프를 재정의한걸 본게 생각나네요

근데 좋은 방법인가는 약간 의문이 듭니다. 왜냐면 타이핑하는데는 좀 편할지몰라도. 읽는데 조금 불편할수도있거든요.

이거 무슨메크로인지 한번 lookup을 해가면서 읽어야되니 ㅡㅡ;

ifree의 이미지

if 의 반대인 unless 입니다.

defmacro unless [condition do-it]
('if condition nil do-it)

C 에서는 불가능하겠죠?

cppig1995의 이미지

#define unless(b) if(!(b)) 하면 되지 않을까요?

Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.

ifree의 이미지

if 문을 치환하는 것은 되는군요.

문제는 조건문과 실행문을 같이 묶어 마크로를 만들 수 있는가? 인데요.
잘 모르겠네요.

sDH8988L의 이미지

머... 대충 이런 식이면 되지 않을까요?

#define LDS_IMPL							\
  {									\
    sqword_t _longhold, _e1, _e2;					\
    enum md_fault_type _fault;						\
									\
    _longhold = READ_WORD(GPR(RB) + SEXT(OFS), _fault);			\
    if (_fault != md_fault_none)					\
      DECLARE_FAULT(_fault);						\
									\
    _e1 = _longhold & 0x40000000;					\
    _e2 = (_longhold >> 23) & ULL(0x7f);				\
    if (_e1)								\
      {									\
	if (_e2 == ULL(0x3f800000))					\
	  _e2 = ULL(0x7ff);						\
	else								\
	  _e2 |= ULL(0x400);						\
      }									\
    else								\
      {									\
	if (_e2 == 0)							\
	  _e2 = 0;							\
	else								\
	  _e2 |= ULL(0x380);						\
      }									\
    SET_FPR_Q(RA, ((_longhold & ULL(0x80000000)) << 32			\
		   | _e2 << 52 | (_longhold & ULL(0x7fffff)) << 29));	\
  }

SimpleScalar라는 시뮬레이터에서 일부 발췌해 봤습니다...

솔직이 매크로질 하자면 한이 없겠죠...

M.W.Park의 이미지

예를 좀 잘못 드신듯합니다.
syntax를 새로 만드는 것과 치환에 기반한 전처리와는 (하늘과 땅 만큼의 엄청난) 차이가 있죠. ^^;
-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

MORIARTY의 이미지

Textmate나 EMACS의 YASnippet 과 같은 스니펫 툴을 쓰시는것이 더 좋을것 같습니다.

======= ======= ======= ======= =======
홈즈, 그만 좀 따라다니게나.