📌 GCC의 약자는 뭔가요?
- 원래는 GNU C Compiler의 약자, 현재는 GNU Compiler Collection의 약자임.
- 바뀐 이유 : 현재 GCC는 C 뿐만 아니라 Ada, C, C++, Fortran, Java와 Objective-C와 같은 다양한 언어를 컴파일하기 때문임.
📌 GNU는 뭔가요? *거뉴
- GNU's Not Unix의 약자임.
- GNU는 리처드 M. 스톨맨이 세운 Free Software Foundation의 프로젝트로, 사용권이 있어 사용하려면 돈을 내야했던 UNIX 소프트웨어에 일종의 저항을 하기 위해 만들었음. (Free Software Foundation은 공식 홈페이지에 따르면 사용자들은 모두 무료로 소프트웨어를 실행하고, 복사하고, 배포하고, 공부하고, 바꾸고, 개선해야한다고 믿는다고 함. GNU 프로젝트에선 UNIX 소프트웨어 주로 사용하던 프로젝트들을 전부 처음부터 다시 새로 짜서 돈을 받지 않고 대중에게 공개했음)
- GNU 소프트웨어는 사실상 OS를 완전체로 만들어주는 역할을 함.
📌 GCC가 뭐가 중요한가요?
- 무료임, 여러가지 언어를 컴파일 할 수 있음.
- 여러 OS에서 돌아가며 자주 사용하는 것을 포함해, 기타 다양한 CPU에 알맞는 코드를 작성해냄.
- GCC는 대부분 UNIX 기반 OS(ex, Linux, BSD, Mac OS X 등)에서 주로 사용하는 컴파일러임.
- 상용적인 목적으로 사용할 수 있음.
📌 GCC가 프로그램에서 에러를 잘 찾아내나요?
- GCC에는 얼마나 철저하게 프로그램을 확인하는지를 제어하는 다양한 커맨드라인 설정이 존재함. 이걸 상요하면, GCC는 프로그램에서 에러를 발생할 가능성이 있는 곳을 꽤나 잘 찾아냄.
💡 몇 가지 자주 사용하는 설정들
- -Wall 컴파일러로 하여금 발생할 것 같은 에러를 찾아내면 경고 메시지를 출력하게 한다. (구체적인 경고문을 보고 싶다면 -W를 사용할 수 있다. -Wall이란 모든 -W이라는 의미이다. ) 효과를 제대로 보려면 -O와 결합해서 사용하는 것이 좋다.
- -W -Wall에 의해 생성된 경고 메시지보다 좀 더 구체적인 추가 경고 메시지를 출력한다.
- -pedantic C의 규격에서 필요로 하는 모든 경고문을 출력한다. 규격이 아닌 기능을 사용하는 모든 프로그램을 배제한다.
- -ansi C의 규격이 아닌 GCC의 기능들을 끄고 보통 사용 불가능한 몇 가지 C 규격인 기능들을 사용 가능하게 만든다.
- -std=c89
- -std=c99 컴파일러가 프로그램을 확인할 때 어떤 버전의 C를 사용할지 결정한다. 위의 설정은 주로 아래와 같이 섞어서 사용한다.
% gcc -O -Wall -W -pedantic -ansi -std=99 -o pun pun.c
📌C의 문법이 가독성을 해칠 정도로 과도하게 간결한게 아닌가요? C가 {랑 }말고 차라리 begin이랑 end를 사용하고, int말고 integer를, 뭐 이런 식으로 사용하는게 더 가독성이 있을 것 같은데요?
- 전설에 따르면 C언어의 간결함은 당시 언어가 개발되던 벨 랩의 환경에 의한 것임.C의 첫 컴파일러는 최초의 미니 컴퓨터였던 DEC PDP-11에서 돌아갔고, 프로그래머들은 컴퓨터에 연결된 타자기였던 teletype을 사용했음. teletype의 경우, 초당 최대 10자 밖에 작성하지 못했기에, 글자를 최대한 줄이는 것이 도움되었음.
📌 어떤 C 언어 교재에선 main 함수가 return 0이 아니라 exit(0)으로 끝나던데요, 같은 의미인가요?
- 같은 의미. 둘 중 무엇을 쓸지는 취향차이~
📌 프로그램이 실행될 때 main 함수가 return 구문을 사용하지 않은 채로 끝난다면 무슨 일이 일어나나요?
- return 구문이 없더라도, 프로그램은 종료될 것임. C99은 main 함수가 int를 반환하라고 선언된다면, 기본적으로 OS에 0을 반환함. 그렇지 않다면, 프로그램은 특정하지 않은 값을 반환함.
📌 컴파일러가 주석을 전체를 지우나요, 아니면 그냥 빈칸으로 대체하나요?
- 오래된 C 컴파일러들은 주석을 전부 다 지웠었음. (a/**/b = 0;을 ab = 0;으로 해석했었음.)
- C 규격에 따르면 컴파일러는 반드시 주석의 각 문자를 스페이스로 대체해, 위와 같은 꼼수는 통하지 않음.
📌 프로그램에 주석 처리를 제대로 안해준 주석이 있는지 어떻게 아나요?
- 운이 좋다면, 컴파일러가 이를 인식해 컴파일을 안 하고 에러를 낼 것.
- 컴파일이 된다면, 디버거를 이용하든 lint와 같은 프로그램을 쓰면 도움될 것.
📌 한 주석을 다른 주석 내부에 처리해줄 수 있나요?
- /* ... */로는 불가능함.
/*
/*** WRONG ***/
*/
// 첫 번째 줄의 /*(주석 시작)은 두 번째 줄의 */(주석 끝)과 짝지어져서, 세번째 줄의 */는 에러처리 될 것.
- //는 주석 내부에서 사용할 수 있음.
📌 float의 이름의 유래가 뭔가요?
- 부동소수점(floating-point)의 약자로, 소수점이 존재하는 숫자를 저장할 때 사용하는 것임.
📌 부동소수점 상수 끝에 왜 f를 붙여주나요?
(완벽한 대답을 얻고 싶다면 7단원을 참고하길 바람.)
- 간단하게 답변하면, 소수점을 포함하지만 f가 붙지 않은 상수는 double 유형이 될 수 있음. double 값은 float 값보다 더 정확하게 저장되어 있고, flaot값보다 더 클 수도 있음. 그렇기 때문에, float 변수를에 값을 할당할 때 끝에 f를 붙여주는 것임.
- 만약 f가 없다면, float 변수에 할당된 값이 변수가 저장할 수 있는 최대값보다 클 수도 있기 때문에 에러가 발생할 수도 있음.
📌 정말로 식별자의 이름 길이엔 한계가 없나요?
- 한계가 없으면서 있음. 컴파일러들은 31번째 글자까지 외우는데, C99의 경우 63글자임. 그렇기에, 서로 다른 두 이름이 31번째 글자까지는 전부 같다면, 컴파일러는 이 둘을 같은 이름으로 인식할 수 있음.
- (외부 링크가 있는 식별자의 경우) 좀 오래된 링커들은 오로지 짧은 이름만 인식해 C89의 경우 6번째까지만 인식함. 대소문자 구분을 안 할 수도 있어, abcdefg랑 ABCDEFG를 같다고 인식할 수 있음. C99의 경우, 31번째까지 인식하고 대소문자를 구분함.
- 대부분의 컴파일러나 링커는 생각보다 엄하게 규격을 따르지 않으므로, 식별자가 너무 길지 않을까를 고민하기보다 식별자가 너무 짧지 않나를 고민하자.
📌 들여쓰기를 할 때 줄을 몇 칸 띄워야하나요?
- 연구 결과 최적의 개수는 3칸.
- 대부분의 프로그래머들은 2배수가 아닌 숫자들을 불편해함, 저자는 3-4칸을 선호함.
💡 본 내용은 K.N.King의 C Programming: A Modern Approach 책을 참고하였습니다.
'📚 STUDY > 🔥 C' 카테고리의 다른 글
[3-2] scanf 함수 (0) | 2024.09.02 |
---|---|
[3-1] printf 함수 (4) | 2024.09.02 |
[2-8] C 프로그램의 레이아웃 (0) | 2024.09.02 |
[2-7] 식별자 (0) | 2024.09.02 |
[2-6] 상수 이름 정의하기 (0) | 2024.08.22 |