'c++'에 해당되는 글 6건

Programming/C C++
C에는 한문자를 입출력할때 getchar, putchar함수를 그리고 한문장을 입출력할때는 gets, puts함수를 사용하였습니다.

C++에서는 대부분의 경우 cin이나 cout로 <<, >>를 통해 입력과 출력을 처리하지만 C와 비슷하게 함수를 사용할 수도 있습니다.

#include <iostream.h>

main()
{
  char c;
 
  while(cin.get(c)){
    cout.put(c);
  }
 
  return 0;
}


cin이나 cout는 Class에 의해 파생된 일종의 Object 입니다. 위 Program에서는 이 Object의 get함수와 put함수를 사용해 한문자씩 입출력하고 있습니다.

C에서는 한문자입출력시 변수의 Data형으로 되도록 이면 int형을 사용하는것이 좋다고 하였는데 이는 getchar함수가 입력중지시 -값을 반환하도록 되어 있기 때문입니다.(변수가 이 반환값을 받습니다.)

하지만 위에서 쓰인 get함수는 해당 변수의 값을 함수의 반환값으로 받는것이 아니라 인수로 처리하기 때문에 오류판단여부는 get함수가 반환하는 값으로 처리할 수 있습니다. 따라서 굳이 int형으로 해둘 필요는 없는 것입니다.

문자처리 말고도 cin의 get함수는 문자가 아닌 문자열도 처리할 수 있습니다.

#include <iostream.h>

main()
{
  char s[10];
 
  cin.get(s, 10);
  cout << s << endl;
  
  return 0;
}


get으로 문자열을 처리할때는 두번째 인수에 입력될 해당 문자열의 수를 지정해 줘야 합니다. 떠힌 get으로 문자열을 입력받을때는 개발자가 특정 문자를 지정하여 해당 문자가 발견되면 처리를 중지하도록 할 수 도 있습니다.

#include <iostream.h>

main()
{
  char s[10];
 
  cin.get(s, 10, 'f');
  cout << s << endl;
   
  return 0;
}


get으로 문자열을 처리할때 문자 f 를 만나면 처리를 중지하도록 합니다.

만일 세번째 인수에 중지문자를 지정해 주지 않으면 자동으로 문자열의 종료를 의미하는 0(\0)문자가 지정됩니다.(기본값)

그런데 get을 사용시에는 한가지 문제가 있습니다. 그것은 입력종료문자를 만나 처리가 중지된 이후에는 더이상 입력처리를 행하지 않는다는 것입니다. 이는 읽혀진 종료문자를 처리가 끝난 후에도 여전히 가지고 있기 때문입니다.

#include <iostream.h>

main()
{
  char s[10];
 
  cin.get(s, 10);
  cout << s << endl;
 
  cin.get(s, 10);
  cout << s << endl;
 
  cin.get(s, 10);
  cout << s << endl;
   
  return 0;
}


get을 통해 3번의 입력과 출력을 시도하고 있습니다.

즉, get이 한번 동작하여 \0 문자를 만나 처리가 중지된 이 후 get함수는 이 문자를 여전히 가지고 있기 때문에 이 후 한번더 동작을 지시하게 되면 바로 \0문자를 만나 처리가 진행되지 않는 것입니다.

이 문제를 해결하려면 cin의 getline함수를 사용해야 합니다. getline함수는 문자열을 처리하는 기본함수인데 사용법은 get함수와 완전히 동일합니다. 다만 두 함수의 차이점은 단지 종료문자를 가지느냐 그렇지 않느냐 하는것 뿐입니다. (getline는 종료문자를 읽으면 그 때의 처리에만 적용할뿐 이 후에는 더이상 가지지 않습니다.)

#include <iostream.h>

main()
{
  char s[10];
 
  cin.getline(s, 10);
  cout << s << endl;
 
  cin.getline(s, 10);
  cout << s << endl;
 
  cin.getline(s, 10);
  cout << s << endl;
   
  return 0;
}

'Programming > C C++' 카테고리의 다른 글

[C, C++] 비트필드(Bit Field)  (1) 2010.04.27
[C, C++] 표준 Library 함수 - 문자열 비교 함수  (0) 2010.04.22
[C, C++] 문자와 문자열 처리(cin Object)  (0) 2010.04.16
[C, C++] Memory동적 확보  (0) 2010.04.15
[C, C++] 참조  (0) 2010.04.06
[C, C++] 함수처리  (0) 2010.04.05
c++, CIN
0 0
Programming/C C++
C++에서 Memory를 동적으로 확보하려면 new와 delete연산자를 사용해야 합니다.(함수가 아닙니다. 고로 별도의 Header File선언도 필요하지 않습니다.)

#include <iostream.h>

main()
{
  int *i;
 
  i = new int;
 
  *i = 3200;
 
  cout << "pointer i의 값 : " << *i << endl;
 
  delete i;
 
  return 0;
}


i = new int;를 통해 int형 Data를 담을 수 있는(4Byte) Memory를 확보하고 해당 int형 주소를 Pointer i에 전달합니다. 이렇게 확보된 Memory에 *i = 3200; 으로 3200이라는 값을 저장하고 그 값을 확인하고 있습니다.

확보된 Memory 공간을 활용한 후 더이상 필요없어지면 delete 연산자를 통해 Memory사용을 해제합니다.


#include <iostream.h>

main()
{
  int *i;
  int j;
 
  i = new int[10];
 
  for (j = 0; j < 9; j++)
    i[j] = j;
 
  for (j = 0; j < 9; j++)
    cout << "i배열 j[" << j <<"]의 값 " << i[j] << endl;
 
  delete [] i;
 
  return 0;
}


예제는 int형 배열 10개의 Memory공간을 확보하고 그 시작주소를 i Pointer에 전달하고 있습니다. 첫번째 for문을 통해 i배열에 값을 넣고 두번째 for 문에서 해당 배열의 값을 확인하고 있습니다.

마지막으로 delete를 통해 Memory를 해제하는데 다만 배열의 경우 '[]' 구문을 추가하여야 합니다.


이때 만일 일차원이 아닌 다차원배열을 동적확보하고자 할 경우에는 다음과 같이 처리해야 합니다.

char (*s) [20];
s = new char[10][20];

즉, 원하는 배열크기를 가지는 Pointer를 먼저 선언하고 그 배열크기에 맞는 다차원배열을 선언해야 하는 것입니다. 동적 Memory할당은 Pointer의 선언과 할당을 별도로 해도 되고 아니면 선언과 동시에 수행할 수도 있습니다.

int *i = new int;

단일크기 확보

char *c = new char[10];

배열크기 확보

char (*s) [20] = new char[10][20];

다차원 배열크기 확보

'Programming > C C++' 카테고리의 다른 글

[C, C++] 표준 Library 함수 - 문자열 비교 함수  (0) 2010.04.22
[C, C++] 문자와 문자열 처리(cin Object)  (0) 2010.04.16
[C, C++] Memory동적 확보  (0) 2010.04.15
[C, C++] 참조  (0) 2010.04.06
[C, C++] 함수처리  (0) 2010.04.05
[C, C++] Class구현시 Static활용  (0) 2010.04.02
0 0
Programming/C C++
C++에서는 어떤 Data를 다루기 위해 C와 같이 Pointer나 변수를 사용할 수 있을 뿐만 아니라 이에 더해 참조라고 하는 개념을 적용할 수 있습니다.

참조도 Pointer의 일종이지만 일반 Pointer처럼 해당 주소값은 변경할 수 없습니다.

#include <iostream.h>

main()
{
  int i;
  int &j=i;
 
  i = 100;
 
  cout << i << endl;
  cout << j << endl;
 
  return 0;
}


int형 변수 i를 선언하고 int &j=i; 를 통하여 변수 i의 주소값을 j에 참조선언하였습니다.

참조는 변수의 주소값을 가지는 Pointer로 해석할 수 있습니다. 따라서 i에 100이라는 값을 설정하면 i가 위치한 Memory상에 100이 설정됩니다. 이때 j는 i의 주소값을 가지고 있으므로 결국 j와 i는 같은 값을 가지게 됩니다. (j는 i의 주소값을 가진채 i의 분신처럼 작용합니다.)


일반적으로 Pointer는 자기자신의 주소값은 물론이고 주소에 있는 Data의 값도 바꿀 수 있지만 참조는 선언될때 변수의 주소값이 정해지며 이후에 다시 주소값을 바꿀 수는 없습니다.(오로지 해당 주소에 존재하는 Data의 값만 조작할 수 있습니다.)

#include <iostream.h>

main()
{
  int i;
  int &j=i;
 
  j = 500;
 
  cout << i << endl;
  cout << j << endl;
 
  return 0;
}

▶값은 조작할 수 있지만

#include <iostream.h>

main()
{
  int i;
  int &j=i;
 
  &j = 500;
 
  cout << i << endl;
  cout << j << endl;
 
  return 0;
}

▶주소는 안됩니다.

참조는 주소를 가진 Pointer입니다. 따라서 참조값이 바뀌면 본래 변수의 값도 바뀌게 됩니다. 이러한 특징은 일반 Pointer와 같다고 할 수 있겠습니다. 이 특징을 숙지하지 않으면 함수에 참조값을 전달할때 실수할 여지가 생길 수 있으므로 주의해야 합니다.

#include <iostream.h>

int plus(int i, int &j);

main()
{
  int i;
  int j;
  i = 100;
  j = 200;
 
  cout << plus(i, j) << endl;
  cout << i << endl;
  cout << j << endl;
 
  return 0;
}

int plus(int i, int &j)
{
  j = 300;
  return i + j;
}


plus 사용자 정의 함수에서 j인수에 &를 붙여 j의 값이 아닌 주소값(참조)을 전달받도록 하였습니다. 따라서 plus함수안에서 j의 값을 바꾸게 되면 main본체의 j의 값도 같이 바뀌게 되는데 이는 값이 아닌 참조를 전달받도록 하였기 때문입니다.


함수를 호출할때 참조값을 넘기면 호출하는 함수측의 값을 바꿀 수 있다고 하였습니다. 바꾸어 말하면 호출되는 함수가 참조값을 반환하도록 할때 이 함수의 값을 조작할 수 있다는 의미가 됩니다.

#include <iostream.h>

int &plus();

main()
{
  plus() = 100;
 
  cout << plus() << endl;
 
  return 0;
}

int &plus()
{
  static int j;
 
  return j;
}


plus함수에서는 j의 값이 아닌 j의 주소값(참조값)을 넘겨주도록 합니다.

int &plus()와 같이 &문자를 붙여 반환하는 값이 변수의 값이 아닌 참조값임을 설정하고 있습니다. 함수를 이와같이 작성하면 직접적으로 plus() = 100;(j 참조) 처럼 값을 설정할 수 있게 되는 것입니다.

plus()에 값을 설정하면 그 값을 변수 j가 받게되고 이어서 j의 참조값을 반환하게 됩니다.

'Programming > C C++' 카테고리의 다른 글

[C, C++] 문자와 문자열 처리(cin Object)  (0) 2010.04.16
[C, C++] Memory동적 확보  (0) 2010.04.15
[C, C++] 참조  (0) 2010.04.06
[C, C++] 함수처리  (0) 2010.04.05
[C, C++] Class구현시 Static활용  (0) 2010.04.02
[C, C++] 확장 문자열  (0) 2010.03.30
0 0
Programming/C C++
C++에서의 함수 작성은 C와 거의 비슷하지만 약간의 차이점을 가지고 있습니다.

C에서 함수를 정의할때는 안정성을 고려하여 되도록이면 함수원형을 선언하도록 하였습니다. 이 말을 뒤집어 보면 안정성을 포기한다면 함수원형을 굳이 선언할 필요가 없다는 뜻이기도 합니다.

#include <iostream.h>

main()
{
  cout << plus(10, 20);
 
  return 0;
}

int plus(int i, int j)
{
  return i + j;
}

▶함수원형을 선언하지 않은 Program

하지만 C++에서는 함수원형의 선언은 생략할 수 없으며 위와 같은 Program은 Compile시에 Error를 발생시킵니다.


#include <iostream.h>

int plus(int i, int j);

main()
{
  cout << plus(10, 20);
 
  return 0;
}

int plus(int i, int j)
{
  return i + j;
}



또한 C++에서는 함수의 원형을 선언할때 해당 함수의 인자에 기본값을 설정할 수 있도록 하였습니다.

#include <iostream.h>

int plus(int i = 10, int j = 20);

main()
{
  cout << plus() << endl;
  cout << plus(10) << endl;
  cout << plus(20, 30) << endl;
 
  return 0;
}

int plus(int i, int j)
{
  return i + j;
}


함수의 원형 선언부분에서 함수의 i와 j인수에 각각 10과 20이라는 기본값을 설정하였습니다.

함수의 기본값을 설정하면 plus()나 plus(10) 처럼 해당 인수로의 값 전달을 생략할 수 있으며 이런경우 기본값으로 설정한 값이 함수내부에서 사용되게 됩니다.


기본값을 설정한 함수를 호출할때 일부분만 값을 전달하도록 하려고 plus(10)처럼 하면 첫번째 인수부터 해당 값의 전달이 이루어집니다. 이는 첫번째 인수를 건너뛰고 두번째 인수부터 값을 전달하는 형태로는 함수를 호출할 수 없다라는 의미가 됩니다.

함수에 기본값을 설정하는 것과 다르게 함수에 전달하는 인수의 성격이 다르면 그 인수에 맞는 각각의 처리를 수행하도록 할 수 있습니다. 이는 함수에 전달하는(전달되오는)인수에 따라 다른 처리를 하고 싶지만 함수의 이름은 똑같이 하고자 하는 경우 유용하게 사용될 수 있습니다.(이런 형태의 구현을 함수의 Overloaded 라고 합니다.)

#include <iostream.h>

int pmls(int i, int j);
double pmls(double d, double b);

main()
{
  int r;
  double d;
 
  r = pmls(10, 20);
  d = pmls(10.5, 5.4);
 
  cout << "정수덧셈 r : " << r << endl;
  cout << "실수뺄셈 d : " << d << endl;
 
  return 0;
}

int pmls(int i, int j)
{
  return i + j;
}

double pmls(double d, double b)
{
  return d - b;
}


pmls라는 함수를 두개 선언하였습니다. 차이는 각 함수마다 전달되오는 인수의 성격에따라 각각 다르게 작동한다는 것입니다. 이렇게 선언하면 C++에서는 해당 함수를 Overloaded 처리하게 됩니다.

첫번째 pmls()함수를 호출할때는 정수값을 전달하였습니다. 따라서 첫번째 pmls()함수 즉, 덧셈을 수행하는 부분으로 처리를 수행하게 되고 두번째 pmls()함수를 호출할때는 실수를 건네줘서 뺄셈을 수행하는 함수로의 처리를 진행하도록 합니다.


여기서 주의해야할 점은 인수의 성격와 실제 그 함수가 반환하는 값의 성격이 같아야 한다는 것입니다. 또한 인수도 서로간의 다른 인수를 지정할 수는 없습니다.

double pmls(int i)
{
  return i;
}

int pmls(int i, double j)
{
  return i + j;
}


위와 같은 처리는 불가능합니다.

C나 C++이나 함수를 호출하면 그 함수부분으로 이동하여 처리를 진행하게 되는데 C++에서는 이 작동방식과는다른 Inline함수라는 것이 추가되었습니다.

Inline함수는 Program동작시 함수로 처리를 이동하는 것이 아니라 Compile시에 정의된 함수자체의 Code를 호출하는 부분에 완전히 끼워넣는 방식입니다.

#include <iostream.h>

inline int plus(int i = 10, int j = 20);

main()
{
  cout << plus() << endl;
  cout << plus(10) << endl;
  cout << plus(20, 30) << endl;
 
  return 0;
}

inline int plus(int i, int j)
{
  return i + j;
}


plus함수정의부분에서 앞에 Inline을 추가하여 plus함수를 Inline함수로 작성하였습니다.

위와같이 함수를 Inline으로 처리하게 되면 Compile시에 함수의 호출부분이 발견될때마다 해당 함수본체를 호출부분에 포함시키게 됩니다. 이렇게 되면 함수로의 처리이동을 할 필요가 없으므로 실행속도가 더 빨리지게 되며 Macro를 통한 함수사용을 보다 안전하게 할 수있다는 이점이 있습니다.

하지만 Inline을 너무 남발해서는 안됩니다. Inline함수의 덩치가 큰 경우 오히려 처리가 제대로 이루어 지지 않을 수 있으며 또한 Inline함수에 for나 while등의 반복문이 사용되었을 경우 Inline처리는 아예 이루어 지지 않을 수 있습니다.

'Programming > C C++' 카테고리의 다른 글

[C, C++] Memory동적 확보  (0) 2010.04.15
[C, C++] 참조  (0) 2010.04.06
[C, C++] 함수처리  (0) 2010.04.05
[C, C++] Class구현시 Static활용  (0) 2010.04.02
[C, C++] 확장 문자열  (0) 2010.03.30
[C, C++] 표준 Library 함수 - 문자 변환 함수  (0) 2010.03.29
0 0
Programming/C C++
Class를 작성하고 해당 Class에 대해 Object를 생성하면 그 Object는 Class의 복사본이라고 할 수 있습니다. 따라서 하나의 Class에 여러개의 Object를 생성하면 그 생성된 수 만큼의 Class가 복사되는 셈입니다.

이렇게 생성된 각 Object는 해당 Class의 Member를 독립적으로 활용하게 됩니다. 바꿔 말하면 생성된 Object끼리는 Member를 공유할 수 없는 것입니다.

#include <iostream.h>
#include <string.h>

class exam{
  private:
    char name[15];
    int age;
 
  public:
    exam(char *nm, int a);
   
    void memberprint();
};

exam::exam(char *nm, int a)
{
  strcpy(name, nm);
 
  age = a;
}

void exam::memberprint()
{
  cout << "이름 : " << name << endl;
  cout << "나이 : " << age << endl;
}

main()
{
  exam student[2] = {
    exam("soo young", 20),
    exam("young soo", 30)
  };
 
  student[0].memberprint();
  student[1].memberprint();
  return 0;
}


하나의 Class에 대해 Object를 2개(배열로) 생성하였습니다.


각각의 Object는 Class의 Member를 독립적으로 활용하고 있습니다.(값을 별도로 유지하고 있음을 주목해 주십시오.)

그렇다면 생성된 Object끼리 Class의 Member를 통해 값을 공유할 수는 없을까요? 이 문제를 해결할 수 있는 것이 바로 static입니다.

Class의 Member에 static을 선언하면 그 Member는 Class의 Object가 몇개 생성되든지 간에 단 하나의 Memory영역에서만 존재하게 됩니다. 결국 이 영역을 각 Object끼리 접근하게 함으로써 서로다른 Object끼리 공유가 가능하게 되는 것입니다.

#include <iostream.h>
#include <string.h>

class exam{
  private:
    char name[15];
    int age;
    static char chrg[15];
 
  public:
    exam(char *nm, int a);
   
    void memberprint();
   
    static void chrgset(char *nm){
      strcpy(chrg, nm);
    }
   
    static void chrgprnt(){
      cout << "담임 : " << chrg << endl;
    }
};

exam::exam(char *nm, int a)
{
  strcpy(name, nm);
  age = a;
}

void exam::memberprint()
{
  cout << "이름 : " << name << endl;
  cout << "나이 : " << age << endl;
}

char exam::chrg[15];

main()
{
  exam student1("young soo", 16);
  exam student2("soo young", 18);
 
  student1.chrgset("soon dong");
  student1.memberprint();
  student1.chrgprnt();
  student2.memberprint();
  student2.chrgprnt();
 
  student2.chrgset("soon ja");
  student1.memberprint();
  student1.chrgprnt();
  student2.memberprint();
  student2.chrgprnt();
 
  return 0;
}


Class의 chrg, chrgset, chrgprnt member에 static를 붙여 해당 Member를 static Member로 선언하였습니다.

이중 chrg[15]는 char형 배열변수입니다. 이 배열변수 static을 Program에서 사용하기 위해서는 Class외부에서 Class이름을 붙여 다음과 같이 선언해야 합니다.

char exam::chrg[15];

이렇게 해야 하는 이유는 만일 Class를 정의할때 Member에 Static를 붙이고 해당 Class가 존재하는 Program을 위 선언없이 실행한다면 Program안에서 Object를 아무리 생성해도 static이 붙은 해당 Member변수는 단지 Class안에서만 존재할뿐 Memory상에 확보되지 않기 때문입니다.

Object가 생성될때마다 static변수도 Memory에 확보되어야 한다면 각각의 Object 마다 static Member가 Memory에 반복적으로 확보될 것입니다. 이러한 동작은 결국 일반 Member변수나 static Member변수나 별 차이가 없게되고 static만의 의미를 상실하게 됩니다. 앞서 말씀드린 것처럼 static Member는 몇개의 Object가 생성되는지와는 상관없이 단 하나만 존재해야 하기 때문입니다.

예제에서 static char chrg[15]배열 변수는 private하위에 정의되었기 때문에 바로 접근할 수 없습니다. 그래서 다음과 같이 static Member의 값을 설정하고 확인할 수 있는 함수를 public하위에 선언하였습니다.

static void chrgset(char *nm){
      strcpy(chrg, nm);
}
   
static void chrgprnt(){
      cout << "담임 : " << chrg << endl;
}

chrgset() static함수는 static Member인 chrg에 값을 설정하기 위한 함수이며 chrgprnt() static함수는 static Member인 chrg의 값을 확인하기 위한 함수입니다.

static Member변수를 다루기 위해 함수도 static으로 선언하였습니다. static함수는 오로지 static Member변수만 다룰 수 있습니다.

참고:
static함수를 Class에서 정의할때는 위와같이 선언과 동시에 해당 함수를 정의하여야 합니다. Static외에 다른 함수처럼 일단 선언하고

void memberprint();

Class밖에서 정의하는 것은 허용하지 않습니다.

 void exam::memberprint()
{
  cout << "이름 : " << name << endl;
  cout << "나이 : " << age << endl;
}

이러한 경우는 일반 Member함수만 가능합니다.

main함수에서는 먼저 학생의 이름과 나이를 저장합니다.

exam student1("young soo", 16);
exam student2("soo young", 18);

그런다음 student1 Object에서 chrset() static Member함수를 호출하여 static Member변수인 chrg에 soon dong이라는 이름을 설정하였씁니다.

student1.chrgset("soon dong");

이후 student1 객체와 student2 객체의 memberprint()함수와 chrgprnt() static Member함수를 호출하여 현재 설정된 값을 확인합니다.

student1.memberprint();
student1.chrgprnt();
student2.memberprint();
student2.chrgprnt();


위 결과에서 담임 이라고 하는 부분을 주목해 주십시오. 분명 위 Program에서는 student1에서만 chrgset static Member함수를 호출하여 이름을 soon dong이라고 설정하였는데 결과에서는 student1과 student2의 담임 이름이 동시에 soon dong으로 출력되고 있습니다.

이것은 static Member변수가 몇개의 Object가 생성되는지 와는 관계없이 단 하나의 Memory영역에서만 존재하기 때문입니다.

이는 student2에서 chrgset으로 값을 설정할때도 마찬가지 입니다. student2에서 chrgset을 통해 chrg에 값을 설정할때도 student2 object의 chrg가 아닌 공통된 영역에서의 chrg에 값을 설정하는 것이므로 student2뿐만 아니라 student1의 담임값도 같이 바뀌게 됩니다.


주의 :
static으로 선언된 Member함수도 각 객체마다 존재하는 Member가 아닌 static Member변수처럼 하나의 Memory영역에 존재하는 것입니다. 결코 각 Object에 static Member함수가 존재하는 것이 아닙니다.

'Programming > C C++' 카테고리의 다른 글

[C, C++] 참조  (0) 2010.04.06
[C, C++] 함수처리  (0) 2010.04.05
[C, C++] Class구현시 Static활용  (0) 2010.04.02
[C, C++] 확장 문자열  (0) 2010.03.30
[C, C++] 표준 Library 함수 - 문자 변환 함수  (0) 2010.03.29
[C, C++] Object간의 연산과 Operator  (0) 2010.02.24
0 0
Programming/C C++
MS사의 Visual Studio 개발도구에는 C와 C++ Compile인 cl.exe Compiler가 같이 포함되어 있습니다.

해당 Compiler의 위치는 C:\Program Files\Microsoft Visual Studio 9.0\VC\bin (VS 2008기준이며 각 VS Version마다 약간씩 차이가 있을 수 있습니다.)에 위치해 있습니다.


cl.exe Compiler는 원한다면 다른 위치에서 사용해도 상관없으나 cl.exe를 이용해 C/C++ Source를 Compil하려면 환경변수라를 것을 먼저 설정해야 합니다.

환경변수 설정은 cl.exe Compiler와 함께 같이 포함되어 있는 vcvars32.bat Batch을 통해 간단히 설정할 수 있으며 이 File을 실행시켜 주기만 하면 됩니다.


특정 작업 Folder를 생성하고 그 안에서 작업하기를 원한다면 cl.exe와 vcvars32.bat File이 같이 존재해야 합니다.

다음은 간단한 Program을 작성하고 작성한 Program을 cl.exe Compiler를 이용해 Compil한 후 Program을 실행시키는 예제입니다.


1. cl.exe로 Compil시 Source File및 Object File Compil

(1) cl aaa.c
aaa.c Source File을 Compil하여 aaa.obj Object File을 만들고 생성된 obj를 Link하여 실행 File을 생성합니다.

(2) cl aaa.obj
aaa.obj Object File을 Link하여 Compile하고 실행 File을 생성합니다.

(3) cl aaa.c bbb.c
aaa.c와 bbb.c Source File을 Compil하여 각각 Object File을 만든 후 생성된 Object와 표준 Library를 Link하여 aaa.exe File을 생성합니다.

(4) cl aaa.c bbb.obj
aaa.c Source File을 Compil하여 aaa.obj를 생성한 후 생성된 obj를 bbb.obj와 Link하여 aaa.exe File을 생성합니다.

(5) cl /c aaa.c
/c Switch는 obj만 생성할 뿐 실행 File은 생성하지 않습니다.

2. cl compiler 경고 Message지정

Compil도중의 경고 Message는 compil하고 실행 File을 생성하는데는 문제는 없으나 Program이 정확히 기술되지 않는등의 문제점을 보고하는 역활을 합니다. 예들 들어

#include <stdio.h>
main()
{
  int i;
 
  printf("hello\n");
}

int 형 변수 i를 선언했지만 사용하지는 않은 Program이 있습니다. 이 Program에 대한 Compil은 문제가 없지만


경고 Message의 Level을 높여 다시 Compile하면


변수 i에 대한 경고 Message를 내뱉게 됩니다.

경고 Message의 Level지정은 /W0 부터 /W4 까지 이며 숫자가 높을 수록 좀더 철저히 Source를 검사하여 Message를 발생시킵니다.(기본값은 /W1)
0 0
1
블로그 이미지

클리엘