C++에서는 어셈블리로 변환하는 과정중에 함수이름을 변화시킨다.

C와 호환(OBJ)를 링크 시키기 위해서는 함수이름을 변경시켜서는 안된다. 

C++에서 함수이름을 변경시키지 못하게 하는 명령어가 있다.



C++ 어셈블리 컴파일




이런식으로하면 함수이름 똑같아짐.



'C언어' 카테고리의 다른 글

20140430 분할컴파일  (0) 2014.04.30
20140428 파일입출력 함수  (0) 2014.04.28
20140428 USART통신  (0) 2014.04.28
20140425 파일열고닫기  (0) 2014.04.25
20140422 링크드함수 삽입.삭제  (0) 2014.04.22
by 날라차숑 2014. 9. 30. 11:37


 #include <stdio.h>

#define HIT_NUM    5

int main()
{
  #if HIT_NUM==5
    puts("매크로 상수 HIT_NUM은 현재 5입니다.");
  #else
    puts("매크로 상수 HIT_NUM은 현재 5가 아닙니다.");
  #endif
  return 0;
}

컴파일 할때 바로 디파인 하는 방법 CL -DHIT_NUM=5 파일이름.C



 #include <stdio.h>

#define STRING_JOB(A, B)  #A "의 직업은 " #B "입니다."

int main()
{

  printf("%s \n", STRING_JOB(김재성,김연아전남편));
  printf("%s \n", STRING_JOB(김재성,손연재현남편));

  return 0;
}

김재성의 직업은 김연아전남편입니다.

김재성의 직업은 손연재현남편입니다.


분할컴파일


메인.c

 #include <stdio.h>


void test(void);

extern int iNum;    //외부파일에 iNum이 선언되어있음
int main()
{
  iNum = 100;    //외부에 int iNum;이라고 외부에 정의되어
        //있어서 대입가능함.   
  printf("%d \n", iNum);  //100나옴
  test();      //테스트함수에서 1증가하고돌아옴
  printf("%d \n", iNum);  //101나옴
  

  return 0;
}

테스트.c 

static int iNum;  //전역변수에 쓰면 다른곳에서 쓸수없게 만듬

void test(void)
{
  ++iNum;
}



'C언어' 카테고리의 다른 글

C와C++ 컴파일 할때 함수이름 주의  (0) 2014.09.30
20140428 파일입출력 함수  (0) 2014.04.28
20140428 USART통신  (0) 2014.04.28
20140425 파일열고닫기  (0) 2014.04.25
20140422 링크드함수 삽입.삭제  (0) 2014.04.22
by 날라차숑 2014. 4. 30. 17:13


 #include <stdio.h>


int main(int iarg, char * cparg[])
{
  FILE * src;
  FILE * des;
  int ch;

  if(3!=iarg)
  {
    printf("사용법 : main4.c 원본파일 사본파일 \n");
    return 0;
  }

  src = fopen(cparg[1],"rt"); 읽기모드
  if(src==0)
  {

    puts("can't open a original file");
    return -1;  
  }
  des = fopen(cparg[2],"wt"); 쓰기모드
  
  if(des==0)
  {

    puts("can't open a copyfile");
    fclose(src);
    return -1;
  }

  while((ch=fgetc(src))!=EOF) src에 들어가있는 아스키코드값을 하나하나씩 출력
    fputc(ch, des);
  if(feof(src)!=0)      
    puts("copy completed");    //파일의 끝이면 0이 아닌값 반환
  else
    puts("copy failed");    //파일의 끝이아니면 0값 반환
  fclose(src);
  fclose(des);
}


 #include <stdio.h>

//#pragma pack(1) 프라그마 쓰면 1byte트씩 하나씩하나씩 차곡차곡 들어가는거 아시져?
struct smart
{
  int iNum;
  char A;
  int iNum2;
  char B;
  short C;
};
//#pragma pack(4)

int main()
{
//  int iNum=0x41424344;
  struct smart test;
  struct smart test2;

  FILE * fp;
  fp = fopen("AA.bin","wb");

  test.iNum = 0x41424344;
  test.A = 'Z';
  test.iNum2 = 0x45464748;
  test.B = 'Y';
  test.C = 0x494A;  

//  fwrite(&iNum,4,1,fp);
  fwrite(&test,sizeof(struct smart),1,fp);   //혹은 sizeof(test)로 해도됨
  fclose(fp);

  fp = fopen("AA.bin","rb");    
  fread(&test2,sizeof(struct smart),1,fp);  //fp를 읽어서 
  fclose(fp);


  printf("struct smart'size: %d \n"sizeof(struct smart)); 스마트구조체 크기

  printf("%08X \n", test2.iNum);
  printf("%c \n", test2.A);
  printf("%08X \n", test2.iNum2);
  printf("%c \n", test2.B);
  printf("%08X \n", test2.C);

  return 0;
}




'C언어' 카테고리의 다른 글

C와C++ 컴파일 할때 함수이름 주의  (0) 2014.09.30
20140430 분할컴파일  (0) 2014.04.30
20140428 USART통신  (0) 2014.04.28
20140425 파일열고닫기  (0) 2014.04.25
20140422 링크드함수 삽입.삭제  (0) 2014.04.22
by 날라차숑 2014. 4. 28. 16:49

 #ifndef _USART_H_

#define _USART_H_

#include "smart.h"

#define UDR0      (*((volatile unsigned char *)0x2C))
#define UCSR0A    (*((volatile unsigned char *)0x2B))
#define UCSR0B    (*((volatile unsigned char *)0x2A))
#define UCSR0C    (*((volatile unsigned char *)0x95))
#define UBRR0H    (*((volatile unsigned char *)0x90))
#define UBRR0L    (*((volatile unsigned char *)0x29))

#define UDR1      (*((volatile unsigned char *)0x9C))
#define UCSR1A    (*((volatile unsigned char *)0x2B))
#define UCSR1B    (*((volatile unsigned char *)0x9A))
#define UCSR1C    (*((volatile unsigned char *)0x9D))
#define UBRR1H    (*((volatile unsigned char *)0X98))
#define UBRR1L    (*((volatile unsigned char *)0x99))

//UCSRnA~C First
#define RXC    7  수신완료비트  
#define TXC    6  전송완료비트
#define UDRE   5  
#define FE     4  프레임에러비트
#define DOR    3  데이터오버런
#define UPE    2  패리티 오류비트
#define U2X    1  1들어가면 속도 두배
#define MPCM   0  병렬처리 멀티모드

#define RXCIE  7 인터럽트 활성화
#define TXCIE  6
#define UDRIE  5
#define RXEN   4  
#define TXEN   3  
#define UCSZ2  2 캐릭터사이즈
#define RXB8   1
#define TXB8   0

#define UMSEL  6
#define UPM1   5
#define UPM0   4
#define USBS   3
#define UCSZ1  2  레지스터B와 공유함,캐릭터 사이즈
#define UCSZ0  1
#define UCPOL  0
//UCSRnA~C End
#define BAUD 19200
#define UBRR  (((F_OSC)/((BAUD)*16L))-1)

void usart_init(void)
{
/*   방법1 !BAUD와 REGISTER값에 따라 값을 바꿔야함
  UBRR0H = 0x00;
  UBRR0L = 0x08; 
*/

//   방법2 !BAUD속도만 바꿔주면 된다.
  UBRR0H = UBRR >> 8;
  UBRR0L = UBRR;
  UCSR0A =  (0<<TXC)|(0<<U2X)|(0<<MPCM);
  UCSR0B =  (0<<RXCIE)|(0<<TXCIE)|(0<<UDRIE)|(1<<RXEN)|(1<<TXEN)|(0<<UCSZ2);
  UCSR0C =  (0<<UMSEL)|(1<<UPM1)|(0<<UPM0)|(0<<USBS)|(1<<UCSZ1)|(1<<UCSZ0);
}
void usart_tx(void)
{
  while(0==(UCSR0A &(1<<UDRE)));  // 1이 될 때까지 무한반복(전송이 가능해질때까지 대기)
  UDR0 = 'A';
  UDR0;
  

void usart_str(const char * cstring)
{
  while(0!=*cstring)
  {
  usart_tx(* cstring)
  cstring++
  }
}

#endif //_USART_H_



'C언어' 카테고리의 다른 글

20140430 분할컴파일  (0) 2014.04.30
20140428 파일입출력 함수  (0) 2014.04.28
20140425 파일열고닫기  (0) 2014.04.25
20140422 링크드함수 삽입.삭제  (0) 2014.04.22
20140421 링크드리스트  (0) 2014.04.21
by 날라차숑 2014. 4. 28. 12:40


 #include <stdio.h>


int main(void)
{
  FILE * src = fopen("src.txt""rt");   //Read 파일 오픈

  FILE * des = fopen("dst.txt""wt");   //Write파일 오픈

  int ch;

  if(src==0 || des==0)
  {
    puts("can't open a file");
    return -1;
  }

  while((ch=fgetc(src))!=EOF)      //src.txt에 있는 파일을 복사함
    fputc(ch, des);
  if(feof(src)!=0)      
    puts("copy completed");    //파일의 끝이면 0이 아닌값 반환
  else
    puts("copy failed");    //파일의 끝이아니면 0값 반환
  fclose(src);
  fclose(des);
}



 #include <stdio.h>


int main()
{
  char str[30];
  int ch;
  FILE * fp = fopen("simple.txt""rt");
  if(fp==0)    //fp가 널값이면
  {
    printf("can't open a file"); //열수없음
    return -1;
  }

  ch = fgetc(fp);    
  printf("%c \n", ch);
  ch = fgetc(fp); 
  printf("%c \n", ch);

  fgets(str, sizeof(str), fp); 
  printf("%s", str);
  fgets(str, sizeof(str), fp);
  printf("%s", str);

  fclose(fp);
  return 0;
}  



'C언어' 카테고리의 다른 글

20140428 파일입출력 함수  (0) 2014.04.28
20140428 USART통신  (0) 2014.04.28
20140422 링크드함수 삽입.삭제  (0) 2014.04.22
20140421 링크드리스트  (0) 2014.04.21
20140417 링크드리스트  (0) 2014.04.17
by 날라차숑 2014. 4. 25. 17:19

#include "LINKEDLIST.H"


void node_print1(node * head)
{
  while(0!=head)
  {
    
    printf("%c->", head->data);
    head=head->next;
  }
  printf("\n");
}
void node_print(node * head)
{
  for(head; 0!=head; head=head->next)
  {
    printf("%c->", head->data);
  }
  printf("\n");

}
void node_free(node * head)
{
  node * temp;
  for(temp=head; 0!=head; temp=temp->next)
  {
    head = head->next;
    free(temp);
    printf("malloc was deleted \n");
  }

}
node* node_insert(node * head, char cdata)
{
  node * stpnew;
  node * stpfront;
  node * stprear;
  stpfront = head;
  stprear = head; 
  stpnew  = malloc(sizeof(node));
  stpnew->data = cdata;
  stpnew->next = 0;

  while(0!=stprear) //serching
  {
     if(stprear->data > stpnew->data) // 삽입할위치판단 
     {
        break;
     }
    stpfront = stprear;
    stprear = stprear->next; 
    
  }
  if(head!=stprear)
  {
    stpnew->next =stprear;
    stpfront->next =stpnew;
  }
  else
  {
    stpnew->next = head;
    head = stpnew;
  }
  return head;
}
node* node_del(node * head, char cdata)
{

  node * stpfront;
  node * stprear;
  stpfront = head;
  stprear = head; 


  while(0!=stprear) //serching
  {
     if(stprear->data == cdata) // 삽입할위치판단 
     {
        break;
     }
    stpfront = stprear;
    stprear = stprear->next; 
    
  }
  if0== stprear)
  {
      return head;
  }//없을때 
  else if(head !=stprear)
  {
    stpfront->next= stprear->next;
  }//중간 삭제
  else
  {
    head = head->next;
  }//앞삭제 
  free(stprear);
  
  return head;
}


'C언어' 카테고리의 다른 글

20140428 USART통신  (0) 2014.04.28
20140425 파일열고닫기  (0) 2014.04.25
20140421 링크드리스트  (0) 2014.04.21
20140417 링크드리스트  (0) 2014.04.17
20140406 링크드리스트 분할컴파일  (0) 2014.04.16
by 날라차숑 2014. 4. 22. 17:47

main.c

 #include "LINKEDLIST.H"


int main()
{
  node * head = 0;
  head = malloc(sizeof(node));
  head->data = 'b';
  head->next = malloc(sizeof(node));
  head->next->data = 'd';
  head->next->next = 0;

  node_print(head);
  head = node_insert(head, 'c');
  head = node_insert(head, 'e');
  node_print(head);

  node_free(head);  
  return 0;
}

linkedlist.c

 #include "LINKEDLIST.H"


void node_print1(node * head)
{
  while(0!=head)
  {
    
    printf("%c->", head->data);
    head=head->next;
  }
  printf("\n");
}
void node_print(node * head)
{
  for(head; 0!=head; head=head->next)
  {
    printf("%c->", head->data);
  }
  printf("\n");

}
void node_free(node * head)
{
  node * temp;
  for(temp=head; 0!=head; temp=temp->next)
  {
    head = head->next;
    free(temp);
    printf("malloc was deleted \n");
  }

}
node* node_insert(node * head, char cdata)
{
  node * stpnew;
  node * stpfront;
  node * stprear; //변수선언
  stpfront = head;
  stprear = head; 
  stpnew  = malloc(sizeof(node));
  stpnew->data = cdata;
  stpnew->next = 0;

  while(0!=stprear) //stp가 들어가기 위한 위치를 찾아라.
  {

      첫번째 포문 아래의 stprear의 데이터는 b이다. stpnew의 데이터는 C이다

          if실행이 안된다.

     두번째 포문 stprear의 data는 d 참 반복문을 빠져나온다.
     if(stprear->data > stpnew->data) // 삽입할위치판단 
     {
        break;
     }
    stpfront = stprear; stprear가 가리키는 곳을 stpfront도 가리킨다.

    stprear = stprear->next; 그다음 stprear->next 즉 d를 가리킨다.
    
  }
  stpnew->next =stprear;  stprear의 주소를 stpnew->next에 넣어준다.
  stpfront->next =stpnew; stpfont->next에 넣어주면 stpfront - stpnew - stprear 트로이카 탄생
  return head;
}


 


by 날라차숑 2014. 4. 21. 17:51


링크드 리스트

 #include "LINKEDLIST.H"


int main()
{
  node * head;
  node * temp1;
  node * new;
  node * temp2;
  
  head=malloc(sizeof(node));
  head->data='a';
  head->next=malloc(sizeof(node));
  head->next->data='b';
  head->next->next = malloc(sizeof(node));
  head->next->next->data='c';
  head->next->next->next=NULL;
  nodeprint_print(head);
  A-B-Z-C //Z의 삽입
  new=malloc(sizeof(node));
  new->data='z';
  new->next=0;

  temp1=head;
  temp1=temp1->next;
  temp2=temp1->next;
  temp1->next=new;
  new->next=temp2;

  printf("\n\n");
  nodeprint_print(head);
  printf("\n\n");

 1-A-B-Z-C //1의 삽입
  new=malloc(sizeof(node));
  new->data='1';
  new->next=0;

  temp1=head;
  head=new;
  new->next=temp1;
  nodeprint_print(head);
  printf("\n\n");
  nodefree_free(head);
  
  return 0;
}


by 날라차숑 2014. 4. 17. 16:53

분할컴파일



main.c linkedlist.c 두개의 파일을 컴파일 해보자

도스창에서 cl /c main.c 라고 치면 main.obj파일 생성

도스창에서 cl /c linkedlist.c 라고치면 linkedlist.obj파일 생성

두개의 파일을 cl main.obj linkedlist.obj 라고 치면 main.exe파일 생성

아니면 cl *.obj 을 쳐도 main.exe파일 생성 (여러개의 obj파일 같이 동작)

cl main.c linkedlist.c 라고 쳐도 파일 생성

cl *.c (가장 느림)

 컴파일 할때 obj(기계어)로 변화하는 과정이 오래걸림 파일이 많을때 cl *.c 는 미친짓이다.





'C언어' 카테고리의 다른 글

20140421 링크드리스트  (0) 2014.04.21
20140417 링크드리스트  (0) 2014.04.17
20140416 소스인사이트 프로젝트생성하는법  (0) 2014.04.16
20140415 연결리스트  (0) 2014.04.15
20140414 atmega구조  (0) 2014.04.14
by 날라차숑 2014. 4. 16. 17:00







헤더파일 작성



'C언어' 카테고리의 다른 글

20140417 링크드리스트  (0) 2014.04.17
20140406 링크드리스트 분할컴파일  (0) 2014.04.16
20140415 연결리스트  (0) 2014.04.15
20140414 atmega구조  (0) 2014.04.14
20140411 구조체  (0) 2014.04.11
by 날라차숑 2014. 4. 16. 10:08
| 1 2 3 4 5 |