Effective C 1장에서는 C 언어에 대한 간단한 Overview를 제시합니다.
1. 첫 C 프로그램 (hello.c)
#include <stdio.h>
#include <stdlib.h>
int main (void) {
puts("Hello, World!");
return EXIT_SUCCESS;
}
2. 프로그램 컴파일 방법
% cc hello.c
% ./a.out
- hello.c를 컴파일한 후 a.out 파일을 생성.
- 생성된 a.out 파일을 실행.
3. Preprocessor Directives (전처리기 지시문)
#include <stdio.h> // stdio.h 라이브러리를 로드. 표준 I/O 함수들을 포함
#include <stdlib.h> //stdlib.h 라이브러리를 로드. 일반적으로 필요한 함수들을 포함
전처리기 지시문은 코드가 실행되기 전, 전처리를 할 때 실행된다. #include 전처리는 라이브러리를 대체한다는 뜻이다.
4. main 함수
main()은 프로그램이 시작될 때 불린다. (i.e. main entry point of program)
main의 반환값은 프로그램의 실행이 성공적이였는지 여부를 나타낸다.
- EXIT_SUCCESS macro는 성공적으로 프로그램이 종료되었을 때 반환하는 값이다. (0)
- EXIT_FAILURE macro는 프로그램 실행에서 문제가 생겼을 때 반환하는 값이다.
5. 함수의 반환값 확인하기
- C 함수들은 보통 함수 실행이 성공적이였는 나타내는 값을 반환한다.
- 예시로 puts()는 실행이 성공적이였을 때는 양수 값을 반환하지만 실행에 실패하였을때는 음수값을 반환한다 (macro EOF).
- 함수의 return statement 뒤에 있는 코드는 실행되지 않는 코드다 (dead code)
#include <stdio.h>
#include <stdlib.h>
int main(void) {
if (puts("Hello, World!) == EOF) {
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
- printf함수는 출력 방식을 나타내는 표현식과 표현식에 있는 conversion specifier들 (예: %s)를 대체하는 varargs값들로 이루어져 있다.
printf("%s\n", "Hello, World!"); //printf 예시
7. Portability (범용성)
- 다양한 C 컴파일러들 (gcc, clang, 등등)이 존재하고 각 컴파일러들의 구현 방식은 조금씩 다르다.
- 그 때문에 5가지 범용성 문제가 발생할 수 있다.
- Implementation-defined behavior: 각 컴파일러들마다 구현의 차이.
- Unspecified behavior: 두 개 이상의 선택지가 있는 표준
- Undefined behavior: 행동이 정의되어 있지 않은 표준 (예: integer overflow)
- Locale-specific behavior
- Common extensions (예: POSIX Threads들이 포함되어 있지 않을 수 있다.)