프로그래밍/C++2013. 5. 18. 19:42
int *p1;
struct employee{
  char name[20];
  int age;
  float sal;
} *p2;

p1 = new int;  //allocates 4 bytes
p2 = new employee; //allocates 32? bytes

int *p3;
p3 = new int[30];  //allocates memory for storing 30 inters

delete p1;
delete p2;
delete [] p3;

에 비해, malloc/free를 쓴다면....

p1 = (int*) malloc (sizeof(int));
p2 = (struct employee*) malloc (sizeof(struct employee));
p3 = (int*) malloc (sizeof(int) * 30);

malloc은 void 타입을 리턴하기 때문에, typecasting도 해 줘야 하고,  new의 경우, array dimension을 지원한다.  물론 variable dimension(dynamic size)도 지원한다.
훨씬 낫지 않은가?

그렇다면 new / free, malloc / delete 이런 조합도 가능할가? 안된다.

한가지 더...
new/delete는 오브젝트들을 생성/파괴 할 수 있는 반면, malloc/free는 메모리를 할당/해제 한다.  이는 중요한 부분으로 클래스 생성/파괴에서 new/delete을 쓰는 이유이다.
Posted by code cat
프로그래밍/C++2013. 5. 11. 14:53

c에서 c++함수 호출 시에 역시 extern "c"를 사용하게 되는데, 우선 예를 보자.

 

// gcd.h

#ifdef __cplusplus

extern "C"

#endif

int gcd(int v1, int v2);

 

//gcd.cpp

#include <boost/math/common_factor.hpp>

#include "gcd.h"

extern "C" {

int gcd(int v1, int v2){

return boost::math:gcd(v1, v2);

}

}

 

//sample.c

#include <stdio.h>

#include "gcd.h"

int main()

{

printf("%d와 %d의 최대공약수는 %d(이)다.\n", 14, 35, gcd(14,35));

return 0;

}

 

(위의 예문은 "BINARY HACKS 해커가 전수하는 테크닉 100선, 진명조 옮김" page 74 ~ page 75에서 발췌한 내용이다.)

뭐 다 좋은데, C++에서 저렇게 extern "C"를 함수에 추가해 줄 수 있는 경우가 과연 많을까?  본인 경험상 라이브러리 함수로 받아 수정을 못하는 경우가 태반인데, 과연 저렇게 수정해서 쓸 수 있는 경우가 많을까 고민이다.

 

뭔가 잘못 알고 있는 건 아닐까? 누가 알면 알려줬으면 좋겠다.

Posted by code cat
프로그래밍/C++2013. 5. 11. 12:09

C++에서 C라이브러리 혹은 프로그램 링크시에 우리는 보통 다음과 같이 쓴다

 

extern "C" 함수리턴타입 함수이름(매개변수원형);

 

그런데 이걸 C에서 쓰듯 함수 콜 직전에 불러준다거나 하면(그리 추천하는 방법은 아니다)

 

'expected unqualified-id before string constant' 

 

라는 GR같은 에러가 난다.

이건 C++에서는 클래스 정의나 함수구현 부분에서 "C"코드를 허락하지 않기 때문이다.

 

Posted by code cat
프로그래밍/C++2013. 2. 2. 20:32

예를 들어 c에서 라이브러리로 제공되는 함수가 있다고 하면 c++에서 그냥 c 함수 부르듯이 하면 알 수 없는 link error를 뿜는다.  

어?   분명히 제대로 적었는데... 하고 헤매일텐데, 이것은 syntax error나 라이브러리 링크가 제대로 안되서 그런 것이 아니라, symbol 이름 안 맞아서 그렇다.  이럴 땐, c++ 에서

extern "C" 함수선언

이렇게 해주면 된다.

Posted by code cat

local git에 commit한 뒤, local source control에서만 지우고 싶을 때는(물론 remote 저장소로 업로드가 안되어 있어야겠지)


git rm --cached file_name


으로 지우면 된다.

Posted by code cat
프로그래밍/C++2013. 1. 1. 02:20

class DefaultDevice : public Device {

public:

DefaultDevice() :

ui(new DefaultUI) {

}

...


1. base class 생성자 호출


2. 생성자가 실행되기 전에 초기화 실행

- 상수(const) 멤버 변수 와 같은 경우 변경이 불가능하나,  이런 방식을 통해 변경 시킬 수 있다.

- 클래스 멤버인 reference 를 초기화 시키는 경우


'프로그래밍 > C++' 카테고리의 다른 글

[c++] expected unqualified-id before string constant  (0) 2013.05.11
C++에서 C 함수 사용하기  (0) 2013.02.02
cout , endl 의 원리  (0) 2012.04.28
Android Framework 분석을 위한 C++ 4일차  (0) 2012.04.26
[C++] Smart Pointer  (0) 2012.04.25
Posted by code cat
프로그래밍/C2012. 11. 24. 11:13

결론부터 말하면, typedef 과 static은 storage class이기 때문에, 둘다 동시에 사용 못한다.

(우리가 변수를 int와 long으로 동시에 선언하지 못하듯이 말이다.)

 

또한 typedef은 변수를 instance화 시키는게 아니라, type을 선언하는 것이다.  반면에 static은 instance에 적용된다.

'프로그래밍 > C' 카테고리의 다른 글

typedef struct 안에서 스스로를 참조 할 때 주의점  (0) 2013.11.19
symbol visibility  (0) 2013.08.07
인라인 어셈블리  (0) 2012.09.25
include guard에 대해서  (0) 2012.09.24
구조체 초기화 방법  (0) 2012.08.21
Posted by code cat
프로그래밍/JAVA2012. 10. 1. 21:20

출처: http://docs.oracle.com/javase/tutorial/java/generics/types.html

 

 

Generics이란?

generics은 class와 interface를 type화 시킬 수 있다.  generics를 사용하면 다음과 같은 이점이 있다.

  • 컴파일 시에 type 체크를 할 수 있다.

컴파일 시에 generic 코드를 체크 함으로써 에러를 미리 방지 할 수 있다.

  • cast를 생략할 수 있다.

List list = new ArrayList();

list.add("hello");

String s = (String) list.get(0);

를 generics을 사용한다면,

 

List<String> list = new ArrayList<String>();

list.add("hello");

String s = list.get(0);

  • generic algorithm을 사용 할 수 있다.

다른 type들로 이루어진 collections에 대한 generic algorithm을 사용할 수 있다.

 

일반적인 Generics  사용법

 

generic class는 다음과 같은 형태이다.

class name<T1, T2, T3, .... Tn> { ... }

 

예제를 통해 보자.

 

generic을 써서 위의 코드를 다시 작성하면,

 

 

보는 바와 같이 Object 대신 type T를 사용할 수 있다.  왜 T냐면.. 보통 다음과 같은 conventions를 따르기 때문이다.

 E

 Element

 K  Key

 N

 Number
 T  Type
 V  Value

 S, U, V

 2nd, 3rd, 4th types

 

 

Generic Type 사용법

 

geneirc Box class를 참조시에 다음과 같이 한다.

Box<Integer> integerBox;

 

위의 경우 Type argument이다. 여기서 Type paramemter 랑 Type argument의 차이점을 보자.

 

Type Parameter and Type Argument Terminology: Many developers use the terms "type parameter" and "type argument" interchangeably, but these terms are not the same. When coding, one provides type arguments in order to create a parameterized type. Therefore, the T in Foo<T> is a type parameter and the String in Foo<String> f is a type argument. This lesson observes this definition when using these terms

 

 

 

 

 

 

 

'프로그래밍 > JAVA' 카테고리의 다른 글

OTA Package Utility  (0) 2013.11.25
Swing desiginer LookAndFeel 종류  (0) 2013.11.19
WindowBuilder Pro for Eclipse 3.7(Indigo) 설치 오류  (0) 2012.08.06
ant 빌드가 안될 때  (0) 2011.10.19
Posted by code cat
프로그래밍/C2012. 9. 25. 09:15

    인라인 어셈블리



    1. #if __LINUX_ARM_ARCH__ >= 6

    2. static inline unsigned long arch_local_irq_save(void)

    3. {

    4. unsigned long flags;

    5. asm volatile(" mrs %0, cpsr    @ arch_local_irq_save\n"

    6. "            cpsid i"

    7. : "=r" (flags) : : "memory", "cc");

    8. return flags;

    9. }


 인라인 어셈블리에 대해서 간단히 짚고 넘어가자. 나중에 보면 이해가 안될거 같으니까.

보통 다음과 같은 문법이다.

__asm__ __volatile__ (asms : output: input: clobber);

ANSI에서는 __asm__만 쓰니까, asm 보단 __asm__을 쓰는게 낫다.  volatile(__volatile__)은 최적화를 진행하지 않는다.  컴파일러가 괜히 머리 쓴다고 사용되지 않는다고 판단되는 변수를 없애는 불상사를 방지한다.

asm은 따옴표로 둘러싸인 어셈블리 코드(여기서는 "mrs ... cpsid i"가 되겠다)이며, %와 같은 형태로 input, output parameter를 사용할 수 있다.  컴파일 후, 파라미터가 치환된 대로 어셈블리 코드로 나타난다.

output은 결과값을 출력하는 변수이다. 

"=r"(flags)이다. =는 쓰기전용이란 뜻이다.

input은 output과 같은 방식으로 사용하고, 인라인 어셈블리 코드에 넘겨주는 parameter를 적는다.

clobber는 asm를 실행 시, 값이 변하는 것을 적어준다.  각 변수는 쉼표로 구분되며 각각을 따옴표로 감싸준다. "memory", "cc"가 되겠다.

이제 실제 코드를 분석해 보면,

mrs %0, cpsr 에서는 "=r" (flags)에서, 레지스터 넘버를 flags로 받은 뒤 나오는 레지스터로 cpsr를 저장시킨다. 그 후 cpsid i를 통해 인터럽트를 disable 시킨다. cpsid i는 arm cortex에서 인터럽트를 disable 시킨다. armv7 전용 명령어로 알고 있었는데, ifdef에서 version 6부터 체크하는 걸 보니, armv6에서도 가능한가 보다.

clobber 영역의 "memory"는 컴파일러에게 어셈브릴 코드가 메모리의 어딘가를 변경한다고 가르쳐 주는 것이다. 만약 이렇게 안해주면 컴파일러는 어셈블리코드에서 메모리의 내뇽을 변경하는 것을 컴파일러는 전혀 알 수 없다. "memory"를 명시해 주면, 컴파일러는 어셈블리 코드를 실행하기 전/후에 레지스터에 저장되어 있는 모든 변수의 값을 갱신하도록 한다. "cc"는 컴파일러에게 어셈블리 명령어가 컨디션 코드 플래그를 읽고 쓴다고 알려준다.  설명이 길어졌다. 결국, cpsr를 저장하고 인터럽트를 disable 시킨다.

'프로그래밍 > C' 카테고리의 다른 글

symbol visibility  (0) 2013.08.07
typedef 와 static 을 동시에 사용 못하는 이유  (0) 2012.11.24
include guard에 대해서  (0) 2012.09.24
구조체 초기화 방법  (0) 2012.08.21
error: expected identifier before numeric constant  (0) 2012.07.03
Posted by code cat
프로그래밍/C2012. 9. 24. 13:58

include guard란 실수로 인해 같은 header 파일이 한번 이상 include되는 걸 막는 방법이다.


아래 예제를 보자.


basic.h


intermediate.h


expert.c


보는 바와 같이 expert.c에서 basic.h를 두번 include하는 결과가 되었다. (라인1에서 한번, 라인 2의 intermediate.h는 결국 basic.h를 include한다)


그래서 이러한 상황을 막기 위해 헤더파일을 정의 할 때 다음과 같이 basic.h에 중복 정의를 막는 매크로를 사용한다.

basic.h  (modified)

 

이러한 예제만 보면 별거 아닌거 가지고 저러나 싶겠지만, 파일 수십가지 수백가지가 되면 의도치않게 중복으로 include하게 된다.

Posted by code cat