18-2-다.#if

#ifdef, #ifndef는 매크로의 존재 여부만으로 컴파일 조건을 판단하며 매크로가 어떤 값으로 정의되어 있는지는 평가하지 않는다. 이에 비해 #if는 매크로의 값을 평가하거나 여러 가지 조건을 결합하여 컴파일 여부를 결정하는 좀 더 복잡한 전처리문이다. #ifdef보다는 사용법이 조금 까다롭지만 C 언어의 조건문과 유사하므로 쉽게 익힐 수 있다. 기본 형식은 다음과 같다.
#if 조건1
코드1 // 조건1을 만족하면 코드1을 컴파일
#elif 조건2
코드2 // 조건 2가 만족되면 코드2를 컴파일
#else
코드3 // 둘 다 맞지 않으면 코드 3을 컴파일
#endif
C 언어의 if .... else if .... else와 거의 유사한 구문이라고 볼 수 있다. #elif와 #else는 필요없을 경우 생략 가능하며 #elif는 얼마든지 올 수 있다. #elif를 반복적으로 계속 사용하면 C언어의 switch case 구문과 유사한 구조를 만들 수 있다. #if는 뒤의 조건을 평가해 보고 이 조건이 참이면 바로 아래의 블록을 컴파일러에게 넘기고 그렇지 않다면 삭제하여 없는 것으로 취급한다. 뜻 그대로 조건에 따라 컴파일할 블록을 선택하는 것이다.
#if와 #elif다음에는 컴파일 여부를 결정하는 조건문이 오는데 이 조건문은 전처리 과정에서 진위 여부를 판단할 수 있는 것이어야 한다. 실행 중에 값이 결정되는 변수를 참조한다거나 함수를 호출하는 것은 안되며 주로 매크로의 값이 평가 대상이다. 다음은 #if 전처리문의 작성 규칙인데 대부분 상식과 일치하므로 쉽게 이해할 수 있을 것이다.
매크로값을 비교할 때는 상등, 비교 연산자를 사용한다. 같다, 다르다는 ==, != 연산자를 사용하며 대소를 비교할 때는 >, <, >=, <= 비교 연산자가 사용된다. 구형 컴파일러들은 상등 연산자만 허용했었으나 최신 컴파일러는 비교 연산자도 사용할 수 있다. C언어의 상등, 비교 연산자와 모양이 완전히 일치하는 셈이다.
#if (LEVEL == 3)
#if (VER >= 7)
조건문은 꼭 괄호로 싸지 않아도 상관없지만 C의 조건문에 익숙한 개발자들은 #if에도 가급적 괄호를 붙여 주는 편이며 괄호가 있는 편이 보기에도 안정감이 느껴져 좋다. #if는 조건문이 참일 때 1로, 거짓일 때 0으로 평가하는데 결과가 0이 아니면 이어지는 코드 블록을 컴파일한다. 이 점도 C와 동일하다.
비교 대상은 정수 상수여야 하며 실수나 문자열은 매크로와 비교할 수 없다. 컴파일러에 따라 실수 비교를 허용하는 것들도 있는데 조건부 컴파일을 통제하는 매크로는 대소가 있는 값이라기 보다는 주로 표식이기 때문에 실수는 별로 실용성이 없다고 할 수 있다. 정수값을 가지는 다른 매크로와 값을 비교하는 것은 가능하다.
#if (VER == 3.14) // 에러
#if (NAME == "Kim") // 에러
#if (LEVEL == BASIC) // 가능
버전 번호 같은 경우에 1.0, 1.5같이 실수로 표기하지만 매크로 상수로 버전을 표시할 때는 100, 150 등과 같이 정수화해서 사용하는 것이 일반적이다.
수식 내에서 간단한 사칙 연산을 할 수 있다. 전처리기가 연산문을 평가한 후 그 결과를 비교하므로 다소 복잡한 식은 굳이 결과를 계산해 넣을 필요없이 수식을 바로 써도 상관없다.
#if (LEVEL*2 == 6)
#if (TIME == 365*24)
나머지 연산, 비트 연산 등도 가능하다. 그러나 ++, --, 포인터 연산, sizeof, 캐스트 연산 등은 사용할 수 없다. 이런 연산들은 전처리문에서 불가능하거나 의미가 없기 때문이다. 매크로는 상수이므로 좌변값이 아니며 sizeof 연산자는 컴파일시에 평가된다. 전처리는 컴파일 이전의 단계임을 명심하도록 하자.
논리 연산자로 두 개 이상의 조건을 동시에 평가할 수 있다. C언어의 논리 연산자와 같은 &&, ||, !를 그대로 사용하면 된다.
#if (LEVEL == 8 && VER != 3)
세 개 이상의 조건도 물론 평가할 수 있다. 이때 필요하다면 조건 평가의 우선 순위 지정을 위해 괄호를 사용한다.
defined 연산자로 매크로의 존재 여부를 평가할 수 있다. #if defined(MACRO) 전처리문은 #ifdef MACRO와 완전히 동일한 문장이다. 그러나 다른 조건과 함께 매크로의 존재 여부를 평가할 때는 #ifdef를 쓸 수 없으므로 defined 연산자가 따로 제공된다.
#if (LEVEL == 8 || defined(PROFESSIONAL))
defined 연산자는 전처리문내에서만 사용되므로 일반 C코드에서는 사용할 수 없다.
#if 다음의 조건부 컴파일 블록에는 어떤 문장이든지 올 수 있다. a=b+c; 연산문이나 함수 호출문, int i; 같은 선언문은 물론이고 struct tag_A { ~ 같은 정의문도 올 수 있다. 심지어 #include, #define같은 다른 전처리문도 조건부 컴파일(정확하게 표현한다면 조건부 전처리) 대상이 될 수 있다. 그렇다면 #if안에 또 다른 #if문이 올 수 있다는 얘기가 되며 즉 #if는 중첩가능한 전처리문이다.
#if (LEVEL == 8)
LEVEL이 8일 때의 코드
#if (VER > 5)
버전이 5보다 클 때의 코드
#endif
LEVEL이 8일 때의 코드
#endif
#if안에 #ifdef가 올 수도 있고 반대도 가능하며 중첩 깊이에 제한도 없다. 조건속에 또 다른 조건이 있는 것은 자연스러운 것이므로 전처리기는 당연히 조건부 컴파일문의 중첩을 허용한다. 단, 전처리문이 중복될 경우 짝이 되는 #endif가 반드시 존재해야 한다는 것만 주의하면 된다. #endif는 조건부 컴파일 대상의 끝을 명시하는 중요한 역할을 한다. C 코드는 블록이 중첩될 때 적당히 들여쓰기를 하지만 조건부 컴파일 지시자가 중첩될 경우 들여쓰기는 하지 않는 것이 보통이다.
다음은 #if의 활용예를 보자. 어떤 문제를 해결하는데 세 가지(또는 그 이상) 방법이 있고 각 방법을 적용했을 때의 성능을 테스트해 보려고 한다. 이때 각 방법의 코드를 지웠다 넣었다 할 필요없이 다음과 같이 조건부 컴파일문으로 작성해 놓으면 METHOD 매크로만 변경하여 적용할 방법을 쉽게 선택할 수 있다. 이 코드가 다른 프로그램의 부품으로 사용되는 라이브러리이고 고객마다 선호하는 방법이 다르다면 모든 코드를 소스에 둔 채 고객의 주문대로 조건부 컴파일하기만 하면 된다.
#define METHOD 1
#if (METHOD == 1)
방법1
#elif (METHOD == 2)
방법2
#else
방법3
#endif
#if 0도 주석 대신 흔히 사용되는 구문이다. 아주 긴 소스를 잠시 주석 처리해 놓고 싶을 때는 이 부분을 #if 0 .... #endif로 감싸 버리면 항상 거짓이므로 전처리기에 의해 이 코드는 없는 것으로 취급된다. /* */ 주석은 중첩될 수 없어 긴 소스를 주석 처리할 때 불편한 반면 #if 0는 중첩 가능하기 때문에 이런 문제가 없다.


출처 : http://judoboyjin.egloos.com/viewer/4545100


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

[자료형의 크기와 범위]  (0) 2014.04.22
[고급 매크로 표현식]  (0) 2014.04.22
[Static Assert]  (0) 2014.04.16
[itoa, atoi 구현]  (0) 2014.03.04
[scanf에서 공백을 포함한 문자열을 받는 방법]  (0) 2014.02.09
Posted by cyj4369
,

32비트 시스템에서...


- 정수형 자료형 값의 범위

 자료형

크기

계산식 

저장 값의 범위 

 unsigned char

 1byte

 2^8 - 1

 0 ~ 255

 unsigned short

 2byte

 2^16 - 1

 0 ~ 65,535

 unsigned int

 4byte

 2^32 - 1

 0 ~ 4,294,967,295

 unsigned long

 4byte

 2^32 - 1

 0 ~ 4,294,967,295

 

- 음수값을 포함한 정수형 자료형 값의 범위

 자료형

크기

계산식 

저장 값의 범위 

 (signed) char

 1byte

 -2^7 ~ 2^7 - 1

 -128 ~ 127

 (signed) short

 2byte

 -2^15 ~ 2^15 - 1

 -32,768 ~ 32,767

 (signed) int

 4byte

 -2^31 ~ 2^31 - 1

 -2,147,483,648 ~ 2,147,483,647

 (signed) long

 4byte

 -2^31 ~ 2^31 - 1

 -2,147,483,648 ~ 2,147,483,647

 

- 실수형 자료형 값의 범위

 자료형

크기

계산식 

유효숫자1

 float

 4byte

 -3.4 x 10^38 ~ 3.4 x 10^38

 7자리

 (long) double

 8byte

 -1.79 x 10^308 ~ 1.79 x 10^308

 15자리



  1. ¹ 유효숫자: 지수 표현으로 정규화했을 때 표현되는 숫자 [본문으로]



출처 : http://mizaralcor.tistory.com/3

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

[#if, #elif 사용]  (0) 2014.04.22
[고급 매크로 표현식]  (0) 2014.04.22
[Static Assert]  (0) 2014.04.16
[itoa, atoi 구현]  (0) 2014.03.04
[scanf에서 공백을 포함한 문자열을 받는 방법]  (0) 2014.02.09
Posted by cyj4369
,

C언어를 다년간 사용한 프로그래머들도 종종 매크로 연산자에 대해서 정확하게 이해하고 있지 못한 경우가 많다. 매크로를 사용하지 않는다고 대답할 수도 있지만, 이미 복잡한 매크로를 사용한 수많은 소스가 있다는 점을 생각해 본다면 분명하게 이해해 두는 것이 정신 건강에 좋을 것이다. 복잡한 매크로 표현 식을 구성하는데 많이 사용되는 방법에 대해서 살펴보자.

첫째, 문자열 리터럴은 합쳐진다. 이는 매크로라기 보다는 C언어의 특징이다. 이 기능을 사용하면 긴 출력 문장을 손쉽게 여러 개의 부분 문자열로 나눌 수 있다. 또한 다음에 소개될 매크로 연산자를 사용할 때의 표현식도 좀 더 풍부하게 구성할 수 있다는 장점이 있다.

  1. printf("이름: %s\n"  
  2.        "나이: %d\n"  
  3.        "전화번호: %s\n", a, b, c);  


위의 코드를 보자. printf 다음에는 총 세 개의 연속된 문자열 리터럴이 나타난다. 이 세 개의 리터럴은 합쳐져서 "이름: %s\n나이: %d\n전화번호: %s\n" 과 동일한 문자열이 된다.

둘째, ## 연산자를 사용해서 토큰을 합성해서 만들어 낼 수 있다. ##은 합치기 연산자 이다. 다음과 같은 기능을 생각해 보자. COUNT(start)라고 선언을 하면 DWORD startCnt; 라는 변수를 선언하는 기능이다. 이를 매크로를 이용해서 만들어 보면 아래와 같다.

  1. #define COUNT(val) DWORD val##Cnt  


셋째, # 연산자는 전달된 인자를 문자열로 변환시킨다. start를 매크로 인자로 전달했다면 "start"가 된다는 말이다. 변수 값을 출력하는 매크로를 생각해 보자. PRINT(start)를 하면 화면에 start = 3과 같은 형태로 출력하고 싶은 경우다. 이럴 땐 아래와 같이 매크로를 만들면 된다. #연산자와 위에서 소개한 문자열 리터럴이 합쳐진다는 점을 이용한 것이다. 좀 꽁수 같이 보인다면 두 번째 방식같이 구성할 수 도 있다.

  1. #define PRINT(val) printf(#val " = %d", val)  
  2. #define PRINT(val) printf("%s = %d", #val, val)  


넷째, #@ 연산자는 전달된 인자를 문자로 변환시킨다. a를 매크로 인자로 전달했다면 'a'를 만들어 주는 것이다. 아래와 같이 전달된 인자에 대한 문자를 생성해주는 매크로를 예로 들 수 있다.

  1. #define makechar(val) #@val  


다섯째, 매크로의 내용이 복잡하고 한 줄 이상의 표현식이 필요한 경우엔 주로 do ~ while(0)문을 사용한다. 이렇게 하는 이유는 do ~ while(0)가 하나의 구문으로 해석되고 자체 블록을 가지기 때문이다. 이것을 단순 괄호({, })로 대체하면 안 된다. 중첩 if문에서 에러가 나기 때문이다. 주로 아래와 같이 사용한다.

  1. #define COMPLEX_MACRO(a,b,c,d)  do { \  
  2.                int complex_variable; \  
  3.                                       // some processing; \  
  4. while(0)  


여섯째, 릴리즈 버전에서는 무시되는 매크로를 구성하는 경우다. 주로 디버깅 출력을 하는 매크로가 여기에 속한다. Visual C++ 6.0에서는 '?' 연산자를 사용해서 쇼트 서킷을 구성하는 방법을 주로 사용했다. 하지만 이 후 출시된 Visual C++에는 __noop이라는 내장 함수를 가지고 있다. 이 함수는 인자를 모두 무시하는 기능을 한다. 따라서 예전에 복잡한 쇼트서킷을 사용했던 함수를 두 번째와 같이 간단하게 구성할 수 있다.

  1. #define TRACE 1 ? 0 : OutputDebugString  
  2. #define TRACE __noop  




출처 : http://www.jiniya.net/tt/528

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

[#if, #elif 사용]  (0) 2014.04.22
[자료형의 크기와 범위]  (0) 2014.04.22
[Static Assert]  (0) 2014.04.16
[itoa, atoi 구현]  (0) 2014.03.04
[scanf에서 공백을 포함한 문자열을 받는 방법]  (0) 2014.02.09
Posted by cyj4369
,

[Static Assert]

Development/C/C++ 2014. 4. 16. 11:33

StaticAssert (sizeof(ioreq_event) <= DISKSIM_EVENT_SIZE);

이런 사용방법이 있다.

StaticAssert를 따라가보면...



#define StaticAssert(c) switch (c) case 0: case (c):



이렇게 정의되어있다.


만약 c의 값이 0이라면(즉, false라면) 컴파일 과정에서 에러가 발생한다.(case 중첩으로)

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

[자료형의 크기와 범위]  (0) 2014.04.22
[고급 매크로 표현식]  (0) 2014.04.22
[itoa, atoi 구현]  (0) 2014.03.04
[scanf에서 공백을 포함한 문자열을 받는 방법]  (0) 2014.02.09
[objdump in linux]  (0) 2014.01.15
Posted by cyj4369
,

atoi


uint16_t Atoi(unsigned char* str)

{

  uint16_t nSign = 0, nSum = 0;

  

  if(*str == '-' || *str >= '0' && *str <= '9')

  {

    if(*str == '-')

    {

      nSign = 1;

      str++;

    }

    while(*str >= '0' && *str <= '9')

    {

      nSum = (nSum * 10) + (*str - '0');

      str++;

    }

    if(nSign)

      return -nSum;

    else

      return nSum;

  }

  else

    return 0;

}





itoa

unsigned char * Itoa(uint16_t s_value, uint16_t s_radix)

{

    static const char c_base_ascii[] = {0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 'A', 'B', 'C', 'D', 'E', 'F'};

    static unsigned char s_buffer[ 64 ] = {0, };

    uint16_t s_offset = sizeof(s_buffer) - 1;


    do {

        s_buffer[--s_offset] = c_base_ascii[ s_value % s_radix ];

        s_value /= s_radix; 

    }while(s_value != 0u);


    return((unsigned char *)(&s_buffer[s_offset]));

}

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

[고급 매크로 표현식]  (0) 2014.04.22
[Static Assert]  (0) 2014.04.16
[scanf에서 공백을 포함한 문자열을 받는 방법]  (0) 2014.02.09
[objdump in linux]  (0) 2014.01.15
[vim에서 hexedit하기, hex비교하기]  (0) 2014.01.15
Posted by cyj4369
,

scanf를 통하여 공백이 있는 문제열을 입력 받지 못하여 애를 먹였는데, 아래와 같은 방법이 있네요.

- 방법은 문자열 입력 조건을 통하여 처리하는 것입니다.

- 문자열 조건은 []을 통하여 넣을 수 있습니다. 

 

[[[예제]]] 

ㆍchar str[80];

   scanf("%[12345]s", str);

// 입력이 "4567" 이면 str에 "45" 가 기억

 

ㆍchar str[80];

   scanf("%[^12345]s", str);

// 입력이 "6745" 이면 str에 "67"dl rldjr

// ^ 는 [ ] 안 이외의 문자만 입력 허용

 

ㆍchar str[80];

   scanf("%[0-9]s", str);

// 입력이 "45ab" 이면 str에 "45" 가 기억

// 0-9 는 0123456789 와 동일

  

[[[ 공백을 포함한 문자열 입력 방법]]]

 

char str[80];

   scanf("%[^\n]s", str);

// '\n'(new line) 문자를 만나기 전까지 입력을 받습니다.

 

ㆍchar str[80];

   scanf("%79[^\n]s", str);

// '\n'(new line) 문자를 만나기 전까지 입력을 받되, 79자 까지만 입력을 받습니다.

 

ㆍchar str[80];
   scanf("%[a-zA-Z]s", str);

// 영문자만 입력을 받습니다.

 

 ps. gets()는 입력받을 글자수의 제한할 수 없음.

      제한을 두고 싶을땐 sacnf() 함수 사용.

 

 

----------------------------------------------------

c언어에서 가끔 발생하는 문제가 scanf로 입력받다가
입력버퍼가 다 비워지지 않아서 문자입력받는게 씹히는 경우가 생긴다.
c언어 공부하다보면 꼭 한번쯤은 겪어보는 문제
예를 들면

#include <stdio.h>

int main()
{
        char string[20];
        char c;

        scanf("%s", string);
        scanf("%c", &c);

        printf("%s\n", string);
        printf("!!%c!!\n", c);

        return 0;
}

실행 결과는?

문자열만 입력받아버리고 프로그램이 끝나버린다.

원인은
scanf("%s", string);
가 실행되고 나서 입력버퍼에는 개행문자가 그대로 남아있는 거다.

그래서 
scanf("%c", &c);
를 실행하려고 보니 버퍼에 개행문자가 있어서 그걸 c에다 넣어버린거다.
정작 표준입력으로는 아무것도 입력안했는데
예전에 이걸 몰라서 개고생한거 생각하면..

해결방법은
입력버퍼를 비우면 된다.

어떻게?
        scanf("%s", string);

       scanf("%c", &c);
이 두 사이에 입력버퍼를 비워주는 뭔가를 해주면 된다.

1. 간단하게는 getchar(); 를 추가하는 걸로도 가능

2. fflush(stdin); 추가
그런데 이건 gcc에서 안돌아간다. 왜? 당연히 안된다. 표준 fflush함수는 출력버퍼를 비우는 녀석이다.
VC에서는 확장해서 사용하므로 동작하지만 gcc는 안된다.

3. tcflush(0, TCIFLUSH); 추가
0번 디스크립터를 비워라. 그런데 이는 유닉스 계열에서 터미널과 관련된 함수인 듯

4. rewind(stdio); 추가
rewind함수는 매개변수로 들어온 스트림을 초기화하는데 사용

5. 
__fpurge(stdin);
이놈도 리눅스에서만 동작하고 표준은 아니다. stdio_ext.h 추가.

6. 
fgets(string, sizeof(string), stdin);
문자열 입력을 scanf가 아니라 fgets로 받는다.
그러나 입력시 사이즈를 오버하면 똑같은 문제가 발생한다.
그리고 사이즈를 오버하지 않더라도 문자열 끝에 개행문자가 추가된다.

그래서 다음 줄에
string[strlen(string)-1] = '\0'; 로 강제로 널문자를 넣어준다.
개인적으로 제일 많이 사용하는 방식

7. scanf("%*c", c);
%*c는 입력은 받지만 저장은 안한다. 즉 비어있는 \n를 날려버린다.

8. scanf("%c", &c);를 scanf(" %c", &c); 로
%c 앞에 공백을 추가하면 white space를 구분자로 인식한다.


입력들이 간단하게 위와 같이 나온다면 위의 방법들 아무거나 사용해도 되지만
복잡한 입력에 입력버퍼에 뭔가 많이 남는다면
버퍼를 비우는 것이 근본적인 해결방법인듯 하다.


출처 : http://blog.daum.net/jjiyong/18230445

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

[Static Assert]  (0) 2014.04.16
[itoa, atoi 구현]  (0) 2014.03.04
[objdump in linux]  (0) 2014.01.15
[vim에서 hexedit하기, hex비교하기]  (0) 2014.01.15
[코드에서 endian을 파악하는 방법]  (0) 2014.01.06
Posted by cyj4369
,

다음은 objdump의 man내용이다


OBJDUMP(1)                   GNU Development Tools                  OBJDUMP(1)

NAME
       objdump - display information from object files.

SYNOPSIS
       objdump [-a│--archive-headers]
               [-b bfdname│--target=bfdname]
               [-C│--demangle[=style] ]
               [-d│--disassemble]
               [-D│--disassemble-all]
               [-z│--disassemble-zeroes]
               [-EB│-EL│--endian={big │ little }]
               [-f│--file-headers]
               [--file-start-context]
               [-g│--debugging]
               [-e│--debugging-tags]
               [-h│--section-headers│--headers]
               [-i│--info]
               [-j section│--section=section]
               [-l│--line-numbers]
               [-S│--source]
               [-m machine│--architecture=machine]
               [-M options│--disassembler-options=options]
               [-p│--private-headers]
               [-r│--reloc]
               [-R│--dynamic-reloc]
               [-s│--full-contents]
               [-W│--dwarf]
               [-G│--stabs]
               [-t│--syms]
               [-T│--dynamic-syms]
               [-x│--all-headers]
               [-w│--wide]
               [--start-address=address]
               [--stop-address=address]
               [--prefix-addresses]
               [--[no-]show-raw-insn]
               [--adjust-vma=offset]
               [--special-syms]
               [-V│--version]
               [-H│--help]
               objfile...

DESCRIPTION
       objdump displays information about one or more object files.  The options control what particular information to display.  This information is mostly use-
       ful to programmers who are working on the compilation tools, as opposed to programmers who just want their program to compile and work.

       objfile... are the object files to be examined.  When you specify archives, objdump shows information on each of the member object files.

OPTIONS
       The   long   and   short   forms   of   options,   shown   here   as   alternatives,   are   equivalent.    At   least   one   option   from   the    list
       -a,-d,-D,-e,-f,-g,-G,-h,-H,-p,-r,-R,-s,-S,-t,-T,-V,-x must be given.

       -a
       --archive-header
           If  any  of  the objfile files are archives, display the archive header information (in a format similar to ls -l).  Besides the information you could
           list with ar tv, objdump -a shows the object file format of each archive member.

Posted by cyj4369
,

hex edit

#vim <(xxd /usr/bin/filename)

hex compare

#vimdiff <(xxd /usr/bin/filename1) <(xxd /usr/bin/filename2)

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

[scanf에서 공백을 포함한 문자열을 받는 방법]  (0) 2014.02.09
[objdump in linux]  (0) 2014.01.15
[코드에서 endian을 파악하는 방법]  (0) 2014.01.06
[C 올림 구현]  (0) 2013.12.01
[const 키워드]  (0) 2013.10.22
Posted by cyj4369
,

static void getEndian(void) {

int n = 0x11223344;

char *c = (char *)&n;


if(c[0] == 0x11) {

/*BIG_ENDIAN*/

}

else {

/*LITTLE_ENDIAN*/

}

}



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

[objdump in linux]  (0) 2014.01.15
[vim에서 hexedit하기, hex비교하기]  (0) 2014.01.15
[C 올림 구현]  (0) 2013.12.01
[const 키워드]  (0) 2013.10.22
[가장 간단한 이진수 출력]  (0) 2013.10.17
Posted by cyj4369
,

openNFM 중

((FTL_capacity()+PM_PER_NODE-1) / PM_PER_NODE)

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

[vim에서 hexedit하기, hex비교하기]  (0) 2014.01.15
[코드에서 endian을 파악하는 방법]  (0) 2014.01.06
[const 키워드]  (0) 2013.10.22
[가장 간단한 이진수 출력]  (0) 2013.10.17
[2차원 배열 파라미터 전달]  (0) 2013.04.26
Posted by cyj4369
,