대문자 A를 출력하는 방법
- 문자열을 대소문자로 변환하기
- ASCII 코드값을 이용한 대소문자 변환
- 단일 알파벳 대문자 변환
Program Files과 Program Files (x86) 차이점
프로그램 파일과 프로그램 파일(x86)은 Windows 운영 체제에서 사용되는 두 가지 기본 프로그램 파일 저장소
"프로그램 파일" 디렉터리는 64비트 응용 프로그램을 위한 것이며, "프로그램 파일(x86)" 디렉터리는 32비트 응용 프로그램을 위한 것
64비트 시스템에서는 두 디렉터리가 모두 존재할 수 있음
32비트 응용 프로그램은 "프로그램 파일(x86)"에 설치되고, 64비트 응용 프로그램은 "프로그램 파일"에 설치됨
전처리기
- 컴파일하기 전에 프로그램에 대한 일련의 작업을 수행하는 것으로 일반적으로 main()함수 외부에 작성
- 기계어 코드를 생성하지 않으며 소스 코드를 컴파일하기 좋게 가공
- 모든 전처리기는 #기호(구두점)를 명령어 앞에 붙이고
마지막에 문장의 끝을 나타내는 세미콜론(;) 기호를 사용하지 않음 - stdio.h 등의 표준헤더 파일에서 많이 볼 수 있고 #include, #define이 대표적

#define
- 매크로(macro) or 함수같은 매크로를 만들 때 사용
- 매크로(object-like macro)
- 매크로 상수라고도 함
- #define PI 3.141592
- 매개변수가 있는 함수같은 매크로(function-like macro)
- Macros with arguments
- 매크로 함수라고도 함
- #define SUM(i,j) (i+j)
- 여기서 i,j가 매개변수
#define문 : 매크로
- 매크로 또는 매크로 상수는 프로그램 전체에서 하나의 기호 상수를 다른 이름으로 대치시키도록 전처리기에게 알려줌
- 실제 매크로가 호출되면 호출된 자리에 정의된 기호 상수로 대치됨
- #define 매크로명 상수_또는_문자열
- #define PI 3.141592
- 프로그램 중에 PI를 찾아서 컴파일하기 전에 모두 3.141592로 바꾸어 줌
- 그래서 컴파일되는 소스에는 더 이상 PI는 존재하지 않음
- #define SIZE 100 char ch[SIZE]; //char ch[100]; for(i=0;i <100;i++)
- 숫자 100을 그냥 쓰는 것 보다는 SIZE라는 매크로명이 더 많은 정보를 주며
SIZE값을 한꺼번에 바꾸기도 편리함
- 숫자 100을 그냥 쓰는 것 보다는 SIZE라는 매크로명이 더 많은 정보를 주며
- 매크로명은 모두 대문자, 단어 사이는 언더스코어(_)
- PI, SIZE, ARRAY_SIZE, BUFFER_SIZE
#define 매크로를 사용하면 장점

여러 줄 #define문 예

#define문 : 함수같은 매크로(function-like macro)
- #define 매크로명(매개변수,...) (치환리스트)
- 매크로명 다음에 괄호가 오고 괄호 안에는 매개변수
- 치환리스트의 매개변수들은 부작용 방지를 위해 일일이 괄호로 묶어 줌
- #define sum3(i,j,k) ((i)+(j)+(k))
- 프로그램 중에 sum3(매개변수1, 매개변수2, 매개변수3) 부분을 ((매개변수1) +(매개변수2) +(매개변수3))과 같은 형태로 바꿈
- 두 개의 수를 제곱하는 SQUARE라는 매크로 함수
- #define SQUARE(a) ( (a) *(a) )
- 매크로 함수는 매개변수의 자료형에 관계없이 하나의 매크로 함수로 구현이 가능하다는 장점
- 일반 함수로 구현하면 함수 호출시 해당 함수로 넘어가서 실행하고 돌아오는 시간상의 지체가 있는데 비해 매크로 함수는 단순히 치환되는 것이므로 빠름
- 부작용 방지를 위해 치환리스트의 매개변수에 귀찮더라도 일일이 괄호로 묶어 주어야 함
- 요즘은 C99부터 지원하는 inline 함수를 더 많이 사용
- inline 키워드를 함수 정의부 앞에 붙이면 함수 호출 시 해당 함수로 넘어가서 실행하고 돌아오는 시간상의 지체가 없음
- visual studio에서는 일반 함수를 자동으로 inline으로 만들기도 함

#pragma
- 컴파일러 기능을 지정하는 전처리기
- 모든 C컴파일러에서 동작하는 것은 아님
- Visual Studio에서는 동작
- GCC 4.0 이상에서 동작
- GNU
- GCC(GNU C Compiler)
- MinGW(Minimalist GNU for Windows)
- 모든 C컴파일러에서 동작하는 것은 아님
#include 문
- 파일을 프로그램에 포함시키고자 할 때 사용하는 전처리기
- 각종 라이브러리 함수(printf() 등)의 프로토타입(원형, 선언)이나 구조체의 데이터 형 선언 등이 들어 있는 헤더 파일을 프로그램에 포함시키고자 할 때 많이 사용
- #include <파일명>
- #include <stdio.h>
- 컴파일 전에 stdio.h파일을 프로그램에 포함(추가)
- "<"과 ">"는 표준 헤더 파일을 표준 헤더 디렉토리에서 찾아 포함시키는 경우에 사용
- 표준 헤더 파일이 아닌 프로그래머가 만든 파일을 포함시킬 때는 다음과 같이 함
- #include "파일명"
- #include "c:\header_file\han.h"
- #include "stdafx.h"
- #include "resource.h"
- 디렉토리를 생략하면 현재 작업 디렉토리나 표준 헤더 디렉토리에서 파일을 찾음
- C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\ucrt\stdio.h
- #include "파일명"
- 표준 헤더 파일도 큰따옴표를 이용하여 포함시킬 수 있음(비추)
- #include "stdio.h"

함수 선언
- 많이 사용하는 함수들은 프로그래머를 위해서 이미 만들어져 있음
- 이러한 함수를 표준 라이브러리 함수라 하며 printf(), scanf() 등이 대표적
- 이미 만들어져 있으므로 바로 사용하면 되지만 사용하기 전에 반드시 선언(declaration)해야 함
- printf()라는 함수를 사용하려면 먼저 선언을 해야 하는데 직접 선언(8장)을 할 수도 있지만 이 함수가 선언되어 있는 stdio.h라는 파일(표준 헤더 파일)을 프로그램에 포함 시키는 방법이 더 일반적
- #include <stdio.h>
- 표준 헤더 파일(standard header file)은 표준 라이브러리 함수들을 미리 선언해 놓은 파일

#include <stdio.h>
- stdio.h파일을 컴파일하기 전에 프로그램에 포함
- stdio.h파일을 열어보면 다음과 같은 코드를 볼 수 있음
- int __cdecl printf(const char *, ...);
- printf함수의 매개변수는 문자열이고, 개수는 가변이고, 리턴값은 int형이다
- printf()함수의 선언 혹은 원형(prototype)
- C 언어에서 표준 라이브러리 함수는 사용하기 전에 반드시 선언
printf()함수의 선언(프로토타입)
stdio.h파일을 보면 다음과 같은 코드를 볼 수 있음
- _CRTIMP int __cdecl printf(const char *, ...);
- _CRT_STDIO_INLINE int __CRTDECL printf( _In_z_ _Printf_format_string_ char const* const _Format, ...)
이것을 printf()함수의 선언 혹은 프로토타입이라 함
- 함수의 프로토타입은 함수의 사용법
- 함수이름(printf), 입력(매개변수, const char *, ...), 출력(리턴형, int)에 관련된 정보를 제공하는 문장
- _CRTIMP는 동적라이브러리(DLL)와 관련된 것으로 정적 라이브러리를 사용한다면 _CRTIMP는 무시
- __cdecl은 함수 호출규약
- C 언어에서 표준 라이브러리 함수는 사용하기 전에 반드시 선언
- 직접 위의 한 줄을 프로그램 선두(보통 main()함수 전)에 추가해도 되지만 프로토타입이 존재하는 헤더 파일을 포함하여 간접적으로 선언
- 함수 선언은 컴파일러에게 프로그래머가 라이브러리 함수를 올바르게 사용하고 있는지 체크하도록 하기 위한 것
조건부 컴파일 : #if~#endif
해당 부분을 컴파일할 것인지 하지 않을 것인지를 판단하는 전처리기
- #if~#endif
- 조건이 참인지를 검사하여 참이면 #if와 #endif사이의 모든 소스 코드를 컴파일
- #elif는 else if의 줄임말
- 조건 1이 참이면 문장1이 컴파일되고 거짓이면 조건2를 검사하고 참이면 문장 2가 컴파일된다.
- 조건2도 거짓이면 문장3이 컴파일된다.
- 여러 알고리즘을 구현해 놓은 다음 프로그램에 따라 한 가지 알고리즘을 선택하여 컴파일한다던지, 다국어 버전의 프로그램을 만드는데 언어별로 다른 코드를 컴파일하도록 하는데 등에 사용
- stdio.h
- #if ( !defined(_MSC_VER) && !defined(__cdecl) )
#define __cdecl
#endif - #if 뒷 부분이 참이면 #define __cdecl부분을 컴파일
- #if ( !defined(_MSC_VER) && !defined(__cdecl) )
조건부 컴파일 : #ifdef~#endif
해당 매크로가 미리 정의되어 있으면 나열된 문장을 컴파일하라
- #ifdef 매크로명
문장
#endif
#ifdef __cplusplus
extern "C" {
#endif
:
#ifdef __cplusplus
}
#endif - __cplusplus 매크로가 정의되어 있으면 extern "C" { 를 컴파일
- 즉, C 언어 스타일로 컴파일하라는 것
- 모든 C++ 컴파일러는 __cplusplus라는 매크로 상수가 정의되어 있음
- 하나의 헤더가 C/C++을 모두 지원하려면 위와 같이 만들어야 함
- #ifdef~#endif는 #else를 넣어서 다음과 같이 만들 수도 있음
- #ifdef ...
정의되었을 경우 컴파일할 부분
#else
정의되지 않았을 경우 컴파일할 부분
#endif
- #ifdef ...
조건부 컴파일 : #ifndef~#endif
해당 매크로가 미리 정의되어 있지 않을 때 나열된 문장을 컴파일하라.
- #ifndef는 if not defined라는 것으로 “정의가 되어있지 않으면”
- #ifndef 매크로명
문장
#endif - #ifdef 매크로명은 #if defined(매크로명)과 같음
- #ifndef 매크로명은 #if !defined(매크로명)과 같음
- 규모가 큰 프로그램은 .c와 .h파일을 여러 개 가지는데 헤더 파일이 이중으로 포함될 수 있음
- stdio.h의 처음과 마지막 부분에 다음과 같은 전처리기가 있음
- #ifndef _INC_STDIO
#define _INC_STDIO
:
#endif /* _INC_STDIO */
_INC_STDIO라는 상수가 정의되지 않았다면 정의하고 아래 부분들을 컴파일할 것임
그러나 다시 한번 stdio.h를 포함 시키려고 하면 _INC_STDIO가 이미 정의되어 있으므로 컴파일을 중복해서 하지 않도록 하는 것임
#ifdef _DEBUG
디버그모드와 릴리즈 모드에 따라 다른 코드를 작성하고자 할 때

기타 전처리기
#undef
- #define에 의해 이미 정의된 매크로를 취소하는 것
- #undef 매크로명
- 가장 마지막에 정의된 매크로의 정의가 취소
#error
- #error 는 컴파일 동안 에러가 발생하면 컴파일 작업을 중단하고 #error 명령의 행번호와 파일 이름을 포함하는 시스템 정보와 함께 에러 메세지를 출력
- #if !defined(__cplusplus)
- #error C++ compiler required.
- #endif
#line
- 컴파일할 때 행번호와 파일 이름을 변경할 수 있도록 함
- #line 100 "line.c"


미리 정의된 매크로
미리 정의된 매크로(predefined macro)는 프로그래머를 위하여 컴파일러가 미리 제공하는 매크로

