본문 바로가기

Today I Learned

23.02.02 - 파일 입출력2, 매크로, 레퍼런스

fseek(대상 파일 스트림, 이동할 바이트 수, 시작지점)

바이트 단위로 프롬프트를 이동하고 동작 성공시 0, 실패시 -1을 반환

시작지점은 SEEK_SET(시작지점), SEEK_CUR(현재 지점), SEEK END(끝 지점)으로 설정할 수 있다.

ftell(대상 파일 스트림) - 현재 파일 지시자의 위치를 알려준다.

ftell(스트림,0,SEEK_END)로 스트림이 대상으로 하는 파일의 크기를 알 수 있다.

 

feof(대상 파일 스트림) - 파일 지시자가 EOF에 도달했는지 검사

EOF에 도달한 경우 0이 아닌 값을 반환

 

 

 

매크로

매크로는 단순 치환을 통해 함수 매크로 일 경우 자료형에 따라 별도 함수를 재선언 할 필요 없고 

일반 함수 호출에 비해 속도가 빠르다는 것이 장점이다. 단점은 전처리기이기 때문에 오류가 발생하지 않고

컴파일 단계에서 오류가 뜨기 때문에 디버깅이 까다롭다. 아래는 매크로는 단순치환이라는 것을 보여주는 예이다.

#define MUL(X) (X*X)
MUL(2+2) // 8
//단순 치환하기 때문에 2+2*2+2가 된다.

#define MUL(X) ((X)*(X))
MUL(2+2) // 16
//(2+2)*(2+2) 괄호를 넣어주면 의도대로 된다.

 

조건부 컴파일

#if	조건		
#elif	조건		
#else			
#endif			

#ifdef	전처리기 정의 여부		
#elif	전처리기 정의 여부		
#else		
#endif		

#ifndef	전처리기 정의 여부	
#elif	전처리기 정의 여부	
#else			
#endif

ifndef는 헤더파일의 중복을 방지하기 위해 정의되지 않았을 때만 정의하는데

C++에서는 대신 #pragma once라는 전처리기를 이용해 중복을 방지한다.

 

 

 

레퍼런스 - 별명

주소값을 직접참조 (포인터는 간접 참조) 하여 포인터처럼 사용할 수 있도록 제공되는 자료형

레퍼런스는 자체적인 용량을 가지고 있지 않고 사용시점에 참조할 대상을 반드시 지정해줘야 함 (별명이니까)

포인터의 크기는 운영체제에 따라 32비트면 4바이트, 64비트면 8바이트지만 레퍼런스는 본인이 할당하는

공간이 없기 때문에 레퍼런스의 크기를 sizeof로 재면 대상체의 자료형의 크기가 반환된다.

그리고 대상을 한번 지정하고 나면 참조하는 대상을 바꿀 수 없다. 상수 포인터처럼.

레퍼런스의 대상체는 좌변값이어야 하며 const 레퍼런스는 우변 값도 대상체로 지정 가능하지만 읽기 전용이다.

힙 메모리는 포인터를 이용해서만 접근이 가능하기 때문에 레퍼런스로는 힙 메모리에 접근할 수 없다.