프로그래밍/C2012. 2. 5. 07:53
상수를 사용 할 일이 있을 때, 프로그래밍 언어(c vs c++)가 어느거냐에 따라서 호불호가 갈릴 수도 있겠지만 되도록 #define은 피하는게 좋다는 것은 변함이 없겠다.

#define은 전처리기에서 정의된 문자가 정의된 값으로 바뀌어서 처리된다.

예를 들어
#define BUF_SZ 1024

char buf[BUF_SZ];

라고 하면 전처리기의 실행 후에는

#define BUF_SZ 1024

char buf[1024];

라고 바뀐다. 이 후의 컴파일 과정에서는 BUF_SZ라는 매크로 심볼을 참조 할 수 없다. 여기서 발생할 수 있는 문제가 보통 컴파일러는 이 매크로 이름을 디버거로 넘겨주는 심볼 리스트에 포함시키지 않는다.
gcc 의 경우, -g3으로 매크로 정보를 포함시킬 있다.

또한 매크로는 scope에 대한 조절을 하기 어렵다. 예를 들어,
int getFoo(void)
{
#define LOCAL_VAL 124
....
}

는 지역적 scope를 가지지 않는다.

iPhone 에서 작성된 글입니다.

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

file에서 읽어와 strtok을 이용해 struct에 저장하기  (2) 2012.02.28
C의 역사  (0) 2012.02.19
enum 타입 c vs c++  (0) 2012.02.04
system vs exec  (0) 2012.01.30
process & signal  (0) 2012.01.25
Posted by code cat
프로그래밍/C2012. 2. 4. 14:58



라고 enum 타입을 정의 했다고 치자.
그렇다면 이 enum 타입을 리턴하는 함수는 어떻게 정의 할까? c++ 라면 Food라고 해 줄 수 있지만, c에서는 아쉽게도 다음과 같이 써 줘야 한다.



이렇게 하는게 싫다면 typedef 으로 정의해 주면 된다.


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

C의 역사  (0) 2012.02.19
enum vs #define vs const  (0) 2012.02.05
system vs exec  (0) 2012.01.30
process & signal  (0) 2012.01.25
error: invalide storage class for function 'xxxx'  (0) 2011.11.29
Posted by code cat
프로그래밍/C2012. 1. 30. 08:07

system 으로 쉘 명령어를 실행시키거나 프로세스를 실행시키는건 대체적으로 좋지 않은 방법이다. 

이는 system 이 동작하기 위해 먼저 쉘을 실행시키기 때문이다. 이렇게 시작된 쉘은 각 설치된 쉘의 환경등에 따라 다른 동작성을 보일 수 있기 때문이다. 


그래서 보통 대체적으로 쓰이는 것이, exec 이며 exec 계열은 다음과 같이 나뉘어진다. 
execl, execle, execlp
execv, execve, execvp

그러나 이런 exec 또한 프로세스를 실행시킨 뒤 에러가 나지 않는 한 리턴되지 않는다.

즉,우리가 처음 시작한 프로세스에서 여러개의 프로세스를 실행시키기에는 부적합하다는 것이다. 


그래서 대신 자식 프로세스를 생성하거나 쓰레드를 생성하는 것이다

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

enum vs #define vs const  (0) 2012.02.05
enum 타입 c vs c++  (0) 2012.02.04
process & signal  (0) 2012.01.25
error: invalide storage class for function 'xxxx'  (0) 2011.11.29
대상체의 기억수명  (0) 2011.11.29
Posted by code cat
프로그래밍/C2012. 1. 25. 18:34
signal 라이브러리 함수은 다음과 같다.

void (*signal(int sig, void (*func)(int)))(int);

예)
위에 예제처럼 printf를 시그널 핸들러 함수에서 하는건 안전하지 않다.
그보다는, 시그널 핸들러가 플래그를 set하고 메인 함수에서 flag를 체크해서 그에 맞게 처리하는게 좋다.

하지만 X/Open 및 UNIX specifications은 sigaction이라는 프로그래밍 인터페이스를 사용하기를 권장한다.

#include <signal.n>
int sigaction(int sig, const struct sigaction *act, struct sigaction *oact);

설명
sigaction structure는 다음의 멤버들을 가지고 있다.
    void (*) (int) sa_handler  /* 함수, SIG_DFL, SIG_IGN*/
    sigset_t sa_mask            /* sa_handler에서 블록할 signal*/
    int sa_flags                    /* signal action modifier*/

sigaction 함수는 시그널 sig와 연관된 action을 설정한다.
 - oact가 null이 아닌 경우, sigaction은 이전의 signal action을 쓴다.
 -- act가 null인 경우, 아무 일도 안한다.
 -- act가 null이 아닌 경우, 시그널을 위한 action이 설정된다.

act에 의해 가리켜지는 sigaction 안에 있는 sa_handler는 시그널 sig가 들어오면 불려지는 함수에 대한 포인터이다.
sa_mask는 sa_handler가 불리기 전에 프로세스의 시그널 mask에 추가될 시그널 세트들을 설정한다.(이 세트들은 블록되어 프로세스로 전달되지 않는 시그널들이다.  sa_mask를 사용하면 race condition을 방지할 수 있다)

Return value
sigaction이 성공적일 경우, 0을 리턴하고 아닌 경우 -1을 리턴한다. A

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

enum 타입 c vs c++  (0) 2012.02.04
system vs exec  (0) 2012.01.30
error: invalide storage class for function 'xxxx'  (0) 2011.11.29
대상체의 기억수명  (0) 2011.11.29
열거, enum, 이놈  (0) 2011.11.28
Posted by code cat
프로그래밍/C2011. 11. 29. 20:39

이런 에러가 나는 경우는, c는 함수가 다른 함수 안에나 블록 속에 정의되는 것을 허락하지 않기 때문이다.

바꿔 쉽게 말하자면, xxxx라는 함수 위에 있는 함수나 블록 중에서 }를 닫는 것을 잊어 먹었을 경우인 것이다.

{}을 잘 닫았는지 확인하고, 만약 혹시라도 블록 안에나 다른 함수에서 함수를 정의하려고 한다면, 이건 C 표준이 허락치 않는 걸 삽질하려는 것이다.

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

system vs exec  (0) 2012.01.30
process & signal  (0) 2012.01.25
대상체의 기억수명  (0) 2011.11.29
열거, enum, 이놈  (0) 2011.11.28
전처리기 (1)  (0) 2011.11.09
Posted by code cat
프로그래밍/C2011. 11. 29. 14:51

참조(C 펀더멘탈, 전웅 저, 한빛 미디어)

기억수명(storage duration, extent, lifetime)은 대상체에만 적용되는 개념이다.  대상체의 기억수명이란 어떤 대상체가 값을 저장하기 위해 할당받은 메모리를 차지하고 있는 시간을 말한다.  다시 말해, 프로그램에 선언된 모든 대상체가 시작부터 종료까지 계속 메모리에 상주하는게 아니라, 대상체의 기억수명이라는 것에 따라, 어느 순간 할당(alloc)받고  해제(dealloc)하는 것을 말한다.

C가 제공하는 대상체의 기억 수명은,

  • static storage duration 정적 기억수명
  • auto storage duration  자동 기억 수명
  • allocated storage duration  할당 기억 수명

이중 allocated storage duration 할당 기억 수명은 프로그램의 위치에 상관없이 메모리를 원하는 순간 요청하고 해제할 수 있는 기억 수명이다.  malloc()이 대표적인 예가 되겠다.

정적 기억수명과 자동 기억수명, 그리고 할당 기억수명의 가장 큰 차이는 할당되는 대상체의 크기가 프로그램 실행 중에 고정되어 있는지 여부이다.  언어 부분에 의해 지원되는 두 종류(자동, 정적)의 기억수명을 갖는 대상체는 프로그램이 실행되기 전에 그 크기가 상수로 고정되어 있어야 한다.

정적 기억수명을 갖는 대상체는 프로그램이 시작해서 종료될 때까지 메모리에 항상 존재한다.

자동 기억수명을 갖는 대상체는 그 대상체를 지칭하는 통용 범위와 운명을 함께 한다.

Posted by code cat
프로그래밍/C2011. 11. 28. 14:48

(참조: C언어 펀더멘탈, 전웅 저, 한빛 미디어)


이놈은 농담이고, 열거자에 대한 여러가지 알아야 할 것들을 적어 보았다.


동일한 값을 나타내도록 선언 할 수 있음

    enum food { apple = 2, orange = 2, banana = 2 };


대소관계를 순서로 가질 필요도 없음

    enum food { apple = 2, orange = 3, banana = 1};


열거상수로 선언되는 명칭은 일반 명칭과 동일한 이름 공간을 사용

    enum food { apple = 2, orange = 3, banana = 4};

    int apple; /* wrong */


값이 지정되어 있지 않은 경우,

첫번째 열거자면 0으로 값을 갖는다

첫번째가 아니라면 앞의 값보다 하나 큰 값을 가진다.


열거형에는 불완전형의 개념이 존재하지 않는다.

    enum food *p; /* wrong */

    enum food;     /* wrong */


열거형을 위해 사용할 정수형은 다음과 같다.

(signed/unsigned) char

signed/unsigned short int

signed/unsigned int

signed/unsigned long int


열거의 올바른 사용법

가장 올바르게 열거를 사용하기 위해서는 열거를 마치 구조체나 공용체처럼 완전히 독립된 데이터형으로 다루어야 한다. 그러기 위해선, 다음과 같이...

  • 열거형 대상체에는 반드시 그 열거형이 멤버로 갖는 열거 상수만을 대입한다.
  • 열거형 대상체를 다른 정수형의 값과 함께 연산에 사용하는 경우, 반드시 적절한 캐스트 연산자와 주석을 통해 의도를 분명히 밝힌다.
  • 열거형 대상체에 해당 열거형의 열거 상수가 아닌 임의의 정수값을 대입할 필요가 있다면, 그 정수값을 열거형의 멤버로 추가하는 것을 고려한다.
  • 서로 다른 열거형 사이에 대입이나 연산은 피한다.



Posted by code cat
프로그래밍/C2011. 11. 9. 10:26

출처: C 언어 펀더멘탈, 전웅 저, 한빛미디어

#define int2hex(n) ((int)"0123456789ABCDEF"[(int)(n)])


int (int2hex)(int n)

{

    return "012345678ABCDEF"[n];

}


(int2hex)를 괄호로 둘러쌓아, 만일

int int2hex(int n)

으로 함수를 정의했을 때 매크로로 확장되는 걸 방지 할 수 있다.  함수의 주소를 취할 때도 함수명만 사용하거나 함수명에 번지 연산자를  붙인 형태를 사용하기 때문에 전처리 과정에서 매크로로 확장되지 않는다.

만약 필요에 따라 매크로가 아닌 실제 함수를 호출하고 싶다면, #undef 지시자를 사용하거나 다음과 같은 형태의 함수 호출 수식을 사용할 수 있다.

(int2hex)(12);


한편 매크로 함수를 사용하는 또 다른 경우는, 이미 구현되어 있는 함수에서 일정 개수의 인자를 특정 값으로 고정해 사용하는 경우이다.  특히 이는 라이브러리를 구현할 때 많이 사용하는 방법이다.  예를 들어 line()이라는 함수가 구현되어 있다고 하자.

#define line_h(x, y, len, c, s) (line((x),(y),(x)+(len)-1, (y),(c),(s)))

#define line_v(x, y, len, c, s) (line((x),(y),(x),(y)+(len)-1,(c),(s)))

등으로 간단히 매크로로 대체할 수 있다.


여러 수식을 하나의 수식으로 만들어 매크로 함수에 담는 것은 쉼표 연산자를 사용하면 간단하다.  특히 쉼표 연산자는 피연산자로 주어진 수식 사이에서 평가순서와 시퀀스 포인트를 보장해 주기 때문에 연속적인 수식문과 동일하게 사용된다.

#define func_seq() (func1(a,b,c,d),\

    func2(a,b,c,d),\

    func3(a,b,c,d))


매크로 함수 사용시에 세미콜론의 사용여부를 다음과 같이 간단히 처리 할 수 있다.

#define SMT(test, ret) \

    do{                       \

     if(!(test)){             \

        set_error(SMT_ERROR); \

        return ret;

    }

}while(0)

Posted by code cat
프로그래밍/C2011. 10. 23. 14:51
구조체 멤버로 주소를 저장하기 위해서는 구조체 멤버를 포인터 변수로 선언하라
구조체 멤버로 연속적인 메모리를 만들기 위해서는 구조체 멤버를 배열로 선언하라
 

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

process & signal  (0) 2012.01.25
error: invalide storage class for function 'xxxx'  (0) 2011.11.29
대상체의 기억수명  (0) 2011.11.29
열거, enum, 이놈  (0) 2011.11.28
전처리기 (1)  (0) 2011.11.09
Posted by code cat
프로그래밍/JAVA2011. 10. 19. 10:11

거의 십중팔구 jdk가 제대로 안 깔려서 이다.

이걸 확인할려면, javac를 입력해보면 없을 경우, 다음과 같은 패키지에서 어쩌구저쩌구 한다.
그중 openjdk-6을 골라서 sudo apt-get install openjdk-6을 설치 해 준다.

이젠 ant로 잘 빌드가 될 것이다.

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

OTA Package Utility  (0) 2013.11.25
Swing desiginer LookAndFeel 종류  (0) 2013.11.19
Java Generics  (0) 2012.10.01
WindowBuilder Pro for Eclipse 3.7(Indigo) 설치 오류  (0) 2012.08.06
Posted by code cat