다음 코드를 봅시다.

 

 

 FOO(x)는 ((x)*(x))로 define이 된 매크로입니다. 그리고 6번째 줄에 FOO(p(0)); 이 있어요. 이것은 어떻게 대치가 될까요?

 

  만약에 위와 같이 대치가 된다면, 어떻게 될까요? p가 2번 호출됩니다.

 

 

 이것만 보면 이게 굳이 왜. 라는 생각이 드실 수도 있을 거에요. 자. 그러면 질문을 바꿔 봅시다. FOO(u = p(0))은 어떻게 대치가 될까요? 만약에, 이렇게 대치가 된다면 어떨까요?

 

 봐도 모르겠으니, wandbox에서 돌려보겠습니다.

 

 

 operation on 'u' may be undefined. 라고 나옵니다. 음.. 뭔 이야기인지는 모르겠지만, u에 대한 연산이 정의되지 않는다. 정도로 해석을 하면 됩니다. 사이드 이펙트가 있다고 생각해도 무난합니다.

 

 


그렇다면 FOO가 함수인 경우에는 어떤가요?

 

 

 이렇게 바꿨다고 생각해 봅시다. 

 

 

 그러면, p(5)가 먼저 평가됩니다. 이 값이 5입니다. 그러면, 이 값은 FOO를 호출할 때 넘어갑니다. 

 

 

 그러면 function p는 1번만 호출이 됩니다.

 

 


 fgetc와 getc는, 둘 다 한 개의 문자를 stream으로부터 입력 받습니다. 다만, 링크에 따르면 getc는 몇몇 라이브러리에서 매크로로 구현이 될 수 있다고 합니다. C11 표준에서는, 몇몇 라이브러리에서 getc가 매크로로 구현될 수 있다는 말은 없지만, 만약에  getc가 macro로 implement가 되어 있다면, 이라는 구문이 나옵니다. 그 경우에 stream이 2번 이상 평가될 수 있다는 것도 언급이 되고 있어요.

 

 그러면, getc가 매크로로 구현이 되어 있을 수도 있다는 의미는 무엇을 뜻할까요? getc의 인자에 fopen("1.txt","r")을 넣어버리면, 사이드 이펙트가 생길 수도 있다는 의미입니다. 사실 그렇게 넣을 일이 있을까 싶긴 하지만요.

 

 이 정도만 유의하시면, 나머지는 별 게 없습니다. getc와 fgetc는 FILE 포인터를 인자로 받습니다. 만약에, 표준 입력 스트림으로부터 입력 받는다면, stdin을 넘겨주면 됩니다. 그리고, int 값을 리턴하는데요. 성공했다면, 입력을 받은 문자를, 아니면 EOF를 리턴합니다.

 

 

 아래 코드는 표준 입력으로부터, 문자를 계속 입력받는 프로그램입니다. 저는 chogahui라고 입력을 했습니다.

 

 

 그러면, chogahui까지 입력받고, 더 이상 읽을 것이 없습니다. 따라서, 이 때, fgetc 함수는 EOF를 리턴하게 되고, 4번째 줄에 있는 while 루프를 빠져나오게 됩니다.