728x90

특히 신입 개발자분들은... 이글을 꼭 읽어보도록 하자.


영어로 되어 있지만 구글 번역기가 있으므로 부담없이 읽을 수 있다. ㅎㅎ




원문 : https://software.intel.com/en-us/articles/the-ultimate-question-of-programming-refactoring-and-everything?utm_campaign=IHI-HPC-Q4_16&utm_medium=Syndication&utm_source=Taboola&utm_content=&utm_term=&utm_source=taboola&utm_medium=referral




728x90
728x90

stdafx (Standard Application Frameworks) 는 개발자의 생산성 향상을 위해 MS에서 제공하는 소프트웨어 라이브러리 체계를 뜻한다.


C / C++ 에서 헤더 파일은 C 전처리기(PreProcessor) 에 의해 자동적으로 소스 코드를 포함하게 된다. 

그런데 일부 헤더 파일의 경우 방대한 크기의 소스 코드를 포함할 수 있고 (ex : stdio.h, window.h) 이런 코드들을 매번 컴파일하면 빌드의 시간이 점점 길어지게 된다. 

그래서 자주 바뀌지 않는 기본적인 라이브러리들의 경우에 컴파일의 시간을 줄이고자 컴파일러가 사전에 헤더 파일들을 미리 컴파일 해놓고 쓸 수 있게 하고 있다.


이렇게 컴파일 시간을 줄이기 위해 사전에 컴파일한 결과물이 Visual Studio의 경우 .pch(PreCompiled Header) 파일 이다.


쉽게 말하면 stdafx.h 는 미리 컴파일된 헤더 (Precompiled Header) 이다.



미리 컴파일된 헤더의 설정은 프로젝트의 속성에서 확인할 수 있다.




728x90
728x90

개발을 하다보니 Enum의 Item을 문자열로 가져오고 싶어질 때가 있었다.

 

그래서 여기저기 찾아보니 다음과 같은 방법이 있었다.

 

#define ENUM_STR_A(x)     (#x)

#define ENUM_STR_W(x)    (L#x)

https://github.com/Neargye/magic_enum

 

GitHub - Neargye/magic_enum: Static reflection for enums (to string, from string, iteration) for modern C++, work with any enum

Static reflection for enums (to string, from string, iteration) for modern C++, work with any enum type without any macro or boilerplate code - GitHub - Neargye/magic_enum: Static reflection for en...

github.com

 

only header 라이브러리 이므로 그냥 사용하면 된다.

728x90
728x90

어셈블리언어에는 특정 코드 위치로 바로 이동하기 위해서 goto 키워드를 많이 사용한다.
C언어에서도 goto 키워드가 존재하지만 절차식의 C 프로그래밍을 배우면서
흐름을 깨기 때문에 사용하지 않기를 권장한다.

유닉스를 만들기 위해 개발한 언어가 C인데, 정작 유닉스 & 리눅스 코드에서는
goto 키워들 상당 부분에서 발견할 수 있다.
간단히 말해서 엉키지 않게 제대로만 쓰면 error 처리하는 용도로 편리하게 이용할 수 있다.
다시 말하면 함수의 알고리즘의 흐름 상에서 다수의 error 검출을 해서 주로 공통적인 error 처리를 하는 경우,
함수의 끝에 error를 위한 특정 코드를 추가하고 Label을 설정해서 goto 키워드를 이용하는 방식이다.

이러한 goto 대신 비슷하게 사용할 수 있는 방식이 do while을 이용하는 것이다.

do{
  if (err)
      break;
}while(0);
error_handling_code

위와 같은 방식으로 while() 안에 조건을 '0'으로 하여 한 번만 실행되게 하고,
블록 안에서 error가 발생한 경우에만 블록을 빠져나오게 하여 while 이후의 코드를 실행하게 하는 것이다.

본인이 생각컨대 goto 키워드를 굳이 써서 다른 기능을 구현하자면,
다수의 Error에 대해서 그 처리가 공통적이지 않은 경우 여러 개의 Label과
해당 Label로 이동하게 하는 goto 키워드를 써서 구현하는 것이다.
이 경우 절차식 처리에서 상당히 벗어나는 어셈블리언어식 코드가 되는데
엉키지 않도록 주의해서 사용해야 할 것이다.

쓸데 없는 얘기를 많이 한 것 같은데,
결론적으로 goto 키워드를 통한 error 처리 대신에 do while(0)을 쓸 수 있다는 것을 알아두자는 것이다. ^^;


출처 : http://neodelicious.tistory.com/46



goto문에 대한 논의 : https://kldp.org/node/40440

728x90
728x90

리눅스 커널 소스를 살펴보다가 헤더쪽의 매크로에서 “do { … } while(0)” 와 같은 것이 많이 쓰인 것을 보았다.
당연히 { … } 이 한번만 실행되고 끝나는 건데, 왜 이렇게 했을까 궁금해서 찾아보았다.

정리하자면,

1. 빈 문장(“;”)은 컴파일러에서 Warning 을 발생시키므로 이를 방지!
2. 지역변수를 할당할 수 있는 Basic block 을 쓸 수 있다.
3. 조건문에서 복잡한 문장을 사용할 수 있다. 예를 들면 다음과 같은 코드가 있다고 했을 때,

#define FOO(x) \
        printf(“arg is %s\n”, x); \
        do_something_useful(x);


다음과 같이 이 매크로를 사용한다면,

if (blah == 2)
        FOO(blah);


이렇게 해석되어서 쓰여진다.

if (blah == 2)
        printf(“arg is %s\n”, blah);
        do_something_useful(blah);;


뭐가 문제냐고? do_something_useful(blah); 는 조건에 관계없이 수행된다. 이는 원하는 결과가 아니다. 하지만 do { … } while(0) 를 쓴다면 다음과 같이 해석될 것이다.

if (blah == 2)
        do {
                printf(“arg is %s\n”, blah);
                do_something_useful(blah);
        } while (0);


정확히 원하는 결과를 얻을 수 있다.

4. 3번과 같은 경우에 다음과 같이 사용할 수도 있지 않냐고 생각할 수 있다.

#define exch(x,y) { int tmp; tmp=x; x=y; y=tmp; }


그러나 다음과 같은 경우에는 원하는데로 동작하지 않는다.

if (x > y)
        exch(x,y);          // Branch 1
else  
        do_something();     // Branch 2


왜냐하면 다음과 같이 해석되기 때문이다.

if (x > y) {                // Single-branch if-statement!!!
        int tmp;            // The one and only branch consists
        tmp = x;            // of the block.
        x = y;
        y = tmp;
}
;                           // empty statement
else                        // ERROR!!! “parse error before else”
        do_something();


do { … } while(0) 를 사용하면 다음과 같이 해석되어 원하는 의도대로 정확히 쓸 수 있다.

if (x > y)
        do {
                int tmp;
                tmp = x;
                x = y;
                y = tmp;
        } while(0);
else
        do_something();


5. gcc에서는 Statements and Declarations in Expressions 확장을 사용할 수 있다. 이는 위에서 본 do-while-0 Block 대신 쓸 수 있다.



출처 : http://blog.dasomoli.org/220/

728x90
728x90

자꾸 DLL 만들 때 마다 검색하게 되는 것 같다. ㅠ


그냥 코드만 정리해서 올려둔다.



#include <windows.h>


#ifdef MYDLL_EXPORTS

#define MYDLL __declspec(dllexport) 

#else

#define MYDLL __declspec(dllimport) 

#endif


BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)

{

switch (ul_reason_for_call)

{

case DLL_PROCESS_ATTACH:

case DLL_THREAD_ATTACH:

case DLL_THREAD_DETACH:

case DLL_PROCESS_DETACH:

break;

}


return TRUE;

}




사용 예제는 그냥 소스 코드를 첨부하겠다...


DllExample.zip


728x90
728x90



p는 int의 Pointer이고, pr은 int의 Pointer에 대한 참조이다.




여기에서 int* p는 int* b의 복사본이기 때문에 p의 값은 변경되어도 b의 값은 변경되지 않는다.


하지만 int* pr의 경우에는 c의 레퍼런스이기 때문에 pr의 값이 변경되면 c의 값도 변경된다.



출처 : http://www.cplusplus.com/forum/unices/23534/

728x90
728x90

#define GET_MILLISEC ((*(__int64 *)0x7FFE0008)/10000)


nMilliSec = GET_MILLISEC / 1000;


nSec = nMilliSec % 60;


nMin = (nMilliSec % 3600) / 60;


nHour = nMilliSec / 3600;




728x90

+ Recent posts