식별자(identifier)라는 용어는 실상 자주 사용되는 용어는 아니다. 주로 프로그래밍 언어의 스펙(specification)에서나 사용하는 용어로 변수, 상수, 함수, 사용자 정의 타입 등에서 다른 것들과 구분하기 위해서 사용되는 변수의 이름, 상수의 이름, 함수의 이름, 사용자 정의 타입의 이름 등 이름을 일반화 해서 지칭하는 용어이다.

C에서 사용되는 식별자-이름을 짓는데는 몇가지 규칙이 있다.

  1. 영문 대소문자, 숫자, 밑줄(_)만 사용할 수 있다.
  2. 키워드를 식별자로 사용할 수 없다. 키워드는 C언어의 명령어를 지칭한다고 생각하면 된다. 당연히 명령어와 같은 이름이 있다면 컴퓨터뿐 아니라 사람도 헷갈릴 것이다. 키워드는 아래에서 어떤 것들이 있는지 나열해 보겠다.
  3. 식별자는 숫자로 시작될 수 없으며, 반드시 영문자나 밑줄로 시작 되어야 한다. 주의할 것은 밑줄로 시작되는 이름들은 주로 C언어 자체나, 운영체제에서 제공되는 하위 기능의 이름으로 사용되는 경우가 아주 많다는 점이다. ‘밑줄로 시작되는 식별자는 시스템에서 사용하는 식별자’라는 것이 표준은 아니지만 관습적으로 그렇게 이용되기 때문에 밑줄로 시작된 식별자를 보면 무언가 함부로 사용하면 안 되는, 함수 자체에서 효율을 위해 보호를 위한 코드가 거의 작성되지 않았기 때문에 함부로 사용하면 위험할 수도 있는 대상이라는 생각을 하는 사람들도 있을 것이다. 그렇기 때문에 가능하면 밑줄로 시작되는 식별자를 사용하지 않는 것이 혼돈을 줄이는데 도움이 될 것이다. 물론 프로그램 코드를 작성할 때 앞서 말한 용도로 사용되는 함수나 변수를 만들었다면 경고하는 의미에서 밑줄로 시작하는 식별자를 사용해 주는 것도 좋을 것이다.
  4. Visual Stdio 2015 이상 버전에서 달러($)를 사용할 수 있다. 문장의 어떤 위치든지 상관없이 들어갈 수 있다.
  5. C에서의 식별자는 대소문자를 구별한다. 예를 들어 'anumber'와 'aNumber'는 다른 의미로 사용된다.

키워드

+/-

키워드란 C언어에서 명령어나 어떤 의미있는 의미로 사용되는 단어들을 말하며 프로그램 코드를 작성하는 사람은 키워드를 다른 용도로 사용해서는 안 된다. C에서 사용되는 키워드는 다음과 같은 것들이 있다. 각각의 키워드가 어떤 의미로 사용되는지에 대해서는 C문법 전체에 걸쳐서 설명이 될 것이다.

auto
break
case
char
const
continue
default
do
double
else
enum
extern
float
for
goto
if
inline
int
long
register
restrict
return
short
signed
sizeof
static
struct
switch
typedef
union

다시 한번 말하지만 위에 나열된 키워드는 C언어의 일부이기 때문에 다른 용도로 사용해서는 안 된다.

C에서 사용되는 문자들

+/-

C 프로그램 코드에서 사용될 수 있는 공식적인 문자는 다음과 같다.

1. 26개의 라틴 대문자

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

2. 26개의 라틴 소문자

a b c d e f g h i j k l m n o p q r s t u v w x y z

3. 10개의 숫자

0 1 2 3 4 5 6 7 8 9

4. 29개의 특수문자

! " # % & ' ( ) * + , - . / : ; < = > ? [ \ ] ^ _ { | } ~

5. white space 문자

' '(스페이스), 수평탭, 수직탭, 줄바꿈(엔터)

물론 위에 언급된 문자들은 나중에 다시 설명할 상수에서 사용할 수 있는 문자를 의미하는 것은 아니다. 화면에 출력하기 위한 문자열이 아닌 프로그램 코드에서 사용할 수 있는 문자들을 의미한다. 화면에 출력하기 위한 문자열에 사용될 수 있는 문자들은 C 프로그램 코드에서 사용할수 있는 문자와 관련된 내용은 지역화(localization)나 국제화(internationalization)와 관련된 내용에서 찾을 수 있을 것이다. 국제화와 지역화에 관련된 내용은 국제화와 지역화에서 다룰 것이다.

확장문자 (Escape Character)

+/-

확장문자는 문자열을 표시하는 경우에만 사용되며 일반적으로 키보드를 통해 입력하기 곤란한 제어문자(Control Character)를 출력하기 위한 용도로 사용된다.

\a (alert) 보통은 연결되어 있는 스피커를 통해 '삑'소리를 내며, 경우에 따라 화면에 표시를 할 수 도 있다.
\b (backspace) 키보드의 백스페이스와 동일한 역할을 한다. 화면 상에서 백스페이스는 커서 이전의 문자를 지우는 효과가 있지만, 프린터에서는 이미 인쇄한 문자를 지울 수 있는 방법은 없기 때문에 주로 두개의 문자를 겹쳐 찍으려고 할때 사용되었었다. 예를 들어 printf("A\b_"); 라는 명령은 밑줄친 A를 인쇄하는 효과가 있다.
\f (form feed) 인쇄시 페이지를 넘기는 용도로 사용되는 문자로, 화면에 인쇄하는 경우에는 화면을 지우는 효과가 있고, 프린터로 인쇄하는 경우에는 종이를 바꾸도록 하는 효과가 있다.
\n (new line) 줄바꿈을 하려는 경우에 사용되며, 원래 의미는 '현재 위치의 바로 아래줄로 이동한다'였으나 현재는 의미가 변하여 다음에 설명할 '\r'의 의미까지 포함한 '현재 위치의 아랫줄의 첫 위치로 이동한다'라는 의미로 사용된다.
\r (carriage return) 커서가 있는 줄의 가장 첫 위치로 커서를 이동하도록 하는 컨트롤 문자.
\t (horizontal tab) 다음 번 탭 위치로 커서를 이동하여 인쇄를 시작하도록 하게 하는 컨트롤 문자, 키보드에 있는 탭키와 동일한 의미로 동작한다.
\v (vertical tab) 다음 번 수직 탭 위치로 커서를 이동하여 인쇄를 시작하도록 하기 위해 사용되던 컨트롤 문자.

실제로 다음 줄 첫 위치로 인쇄할 위치를 옮기기 위해서는 "\n\r" 혹은 "\r\n"을 써야 했었으나, 단순히 다음 줄의 현재 위치로 커서를 옮기는(\n)동작이나, 현재 줄의 첫 위치로 커서를 옮기는(\r)동작을 구분해서 사용할 이유가 사라졌기 때문에 다음 줄의 첫 위치로 인쇄할 위치를 옮기는 동작은 \n으로 사용한다. 그러나 MS Windows의 경우에는 여전히 \r\n을 사용하여야 하며, MS Windows와 다른 운영체제 간에 이런 면에서 차이점이 존재하기도 한다.

동일한 방법으로 문자를 인쇄할 때 '아스키 코드'나 '유니코드', 'ISO/IEC 10646'같은 문자코드를 직접 입력해서 지정할 수 도 있다. 이러한 방법을 'Universal character names'라 하며 다음과 같이 사용된다:

\u (2 바이트 16진 코드) '\unnnn'의 형태로 사용된다.
\U (4 바이트 16진 코드) '\Unnnnnnnn'의 형태로 사용된다.

위에서 n은 16진수 한자리 값으로 0~9, a, b, c, d, e, f 중 한 글자가 된다. 또한 이 표기방법에서는 정상적으로 표시할 수 있는 문자는 사용되지 않는데, 그 값은 \u00A0 보다 작은 값은 사용하지 않는다. 이때 예외적으로 \u0024 ($), \u0040 (@), \u0060 (`)의 세 문자는 허용된다.

Trigraph sequence

+/-

국내의 상황과는 상관 없는 이야기 이지만, C 표준에는 'Trigraph sequence'라는 것도 존재한다. 특정 언어의 경우 위에 나열한 코드에 사용가능한 문자중 일부를 키보드를 이용해 입력하지 못하는 경우가 있는데, 그런 경우를 위해 마련된 것이다. trigraph sequence는 ??로 시작되는 세 문자이며, 다음과 같은 것들이 있다.

    ??= #    ??( [    ??/ \    ??) ]    ??' ^
    ??< {    ??! |    ??> }    ??- ~

trigraph의 예를 들자면, 아래의 두 코드는 완전히 같은 결과를 얻게 해준다.

printf("Hello???/n");
printf("Hello?\n");

실제로 이 trigraph는 현재의 컴퓨팅 환경에서는 의미 있는 경우가 거의 없다. 그렇기 때문에 컴파일러에 따라서는 이 기능을 아예 지원하지 않거나, 컴파일시 옵션으로 trigraph를 쓰겠다고 지정해 주어야 하는 경우를 많이 볼 수 있을 것이다. 그냥 이런 내용이 있었다는 사실 정도만 기억해 두면 그걸로 족하다. 평생 프로그래머로 살면서 이 표기를 써야 하거나 쓴 경우를 볼 확률은 거의 없겠지만 몰라서 고민하는 일을 겪는 것 보다는 나으리라 생각한다.

미리 지정된 특수한 식별자

+/-

__func__ 식별자는 현재 함수의 이름이다. 주로 디버깅을 돕는 용도로 많이 사용된다. 아래의 프로그램을 입력하여 컴파일, 실행하면 어떤 역할을 하는지 알 수 있을 것이다.

#include <stdio.h>
int main (int argc, char * argv[])
{
    show_your_name();
    return 0;
}

void show_your_name(void)
{
    printf("%s\n", __func__);
    return;
}