error: ISO C++ forbids declaration of ‘자료형’ with no type
-------------------------------------------------------------------------------------------
원인 : 자료형이 제대로 선언되지 않은채 사용되었다.
해결 :
          1. 이 자료형이 선언된 헤더파일의 경로 및 파일이름이 올바른지 확인한다.
          2. namespace안에 구현된 경우일 수도 있으니 namespace를 사용했는지 확인한다.



error: 'NullLock' was not declared in this scope
-------------------------------------------------------------------------------------------
원인 : 자료형이 제대로 선언되지 않았다.
해결 :
          1. 만약 include한 파일이 include path 중에 2군대 이상 존재한다면, 첫번째 path 안에
             있는
파일이 include 된다. 해결하려면 컴파일 옵션에서 include path의 순서를 바꾸
             거나,
using namespaceObject::Something 처럼 사용하고자 하는것만 골라서 쓰면
             된다. 되도록이면 using namespace namespaceObject 처럼 모든 것을 포함시키지 말고,
             using namespaceObject::something 처럼 사용하는것 하나하나씩만 끌어다 쓰도록
             하자.


    (예) lock.h 라는 파일이 /test/lock.h 에 있고 /test/include/lock.h에 있다고 가정하자.
         컴파일 옵션은
         gcc -I/test/lock.h -I/test/include/lock.h -c -o something.o something.cpp
         일때
lock.h 는 처음 include 경로로 잡았던 /test/lock 의 lock.h를 읽어오게 된다.

          2. name space 를 사용했는지 확인한다.

error: undefined reference to 'xxx'
-------------------------------------------------------------------------------------------
원인 : 링킹 과정중 라이브러리 파일이 잘 연결되지 못했다.
해결 :
               1. 라이브러리 명과 라이브러리 경로를 확인한다.
               2. 그래도 안되면 라이브러리 순서를 바꿔본다. (다른 라이브러리에 의존적이지 않은 것을
                    뒤에 오게한다. 반드시 뒤에 기술된 라이브러리는 앞에 기술된 라이브러리를 참조하면
                   안된다)
               3. 1,2번이 안되는 예가 있다. 라이브러리끼리 서로 참조하는 경우에는 순서를 바꿔본들
                   에러는 변함없이 난다. 그런경우 다음과 같이 한다. Xlinker 는 linker 에게 옵션을 넘긴다
                   는 뜻이고 start ~ end-group 은 링크를 하나로 그루핑 하는 function 이다.
                  (예) lib1.a 와 lib2.a 가 서로 참조하는 경우 아래와 같은 옵션을 통해서 해결할 수 있다.
                         gcc -o exefile -Xlinker --start-group lib1.a lib2.a -Xlinker --end-group


error: passing 'const XXXXX' as 'this' argument of 'xxxxxx' discard qualifiers
-------------------------------------------------------------------------------------------
원인 : const로 선언한  class 에서 const 를 보장할 수 없는 함수가 호출되었다. 즉, 어떤 클래스를 
const 로 사용하기로 했는데 그 클래스의 맴버함수중에 const 속성을 보장할수 없는 것을 호출한 
경우이다.

(예) int attachFirstStringAfterSecondString( const string& First, const string& Second )
     {
              Second.attach( First );    // This line Occurs error
     }

해결 : 우선 호출한 함수에 대해 생각해봐야 한다. 이것이 const속성을 보장해야 하는 함수인지 아닌지를 말이다. 만약 이것이 상수성을 보장해야 한다면 첫번째 방법을 써야 하고, 그렇지 않은경우 클래스를 이용할때 const로 이용하지 말아야 한다. 이것은 class design 시 신중하지 않으면 나중에 골치아픈 문제를 야기시킬수 있으므로 design step에서 신경쓰도록 하자.

          1. 함수에 대해서 const 를 보장하게 만든다. (예) int displayValue(void) const;
            - 안에서 멤버변수를 변경하는 부분을 없앤다.
            - 만약 부득이하게 멤버 변수를 변경해야 하는경우 그 맴버 변수를 mutable로 선언한다.
               (예) mutable int length_;
 
           2. class 를 const 형태로 이용하지 않는다. 하지만 이 방법은 추천하지 않는다. 만약 변경될
               필요가 없는 인자 클래스를 const를 벗긴채로 사용할경우, 변경하더라도 아무런 에러를 발생
               시키지 않기 때문에 좋은 코딩스타일이라고 볼 수 없다. 신중히 생각하고 const 를 벗기도록
               하자.
 
error: expected unqualified-id ...
-------------------------------------------------------------------------------------------
원인 : 어딘가에 동일한 이름의 MACRO 가 쓰이고 있다.
해결 : 빌드하는 모든 소스를 검사하여 MACRO 이름을 바꾸거나 겹치지 않게 조치를 취한다.


Mode
-----------------------------------------------------------------------------------------------
앞으로 단축키를 사용할때 어디에서 사용하는지를 나타내기 위해 아래의 4개의 모드(Normal Mode, Insert Mode, Visual Mode, Command Mode)를 사용할 것이다. 각각의 Mode 가 어떤것인지는 약간의 테스트를 한다면 금방 알 것이다.

   - Edit Mode : 문서의 삽입과 편집에서 사용하는 모드이다. 이는 아래의 3개의 모드로 나뉜다.

        1. Normal Mode : 커서로 이동할 수 있는 모드. Insert Mode중에 ESC키를 누르면 나오는
                         모드가
Normal Mode 이다.
        2. Insert Mode : 문서에 내용을 처넣는 Mode. 글자 치는 족족 입력이 된다.
        3. Visual Mode : Normal Mode에서 v, shift + v, ctrl + v등으로 선택할경우 나오는
                         모드이다. 선택영역을 지정할 때 뜨는 모드라고 생각하면 쉽다.


   - Command Mode : Normal Mode에서 콜론(:)을 입력했을때 아래에 명령어를 쳐 넣을수 있게 커서
                    가 뜨는데, 이때를 Command Mode라고 한다.

기본 사용 법 (Normal Mode)
-----------------------------------------------------------------------------------------------
     - 방금전에 입력한 것 또 입력하기 :    .
          만약 i를 눌러서 입력을 std::를 하고 ESC키를 누르면 방금 입력했던 istd::ESC가(키를 눌럿던
          모든 정보) 레지스터에 저장된다. 이때 다른곳에도 똑같은 입력을 하고자 한다면 입력하고자
          하는곳에 커서를 두고  . 을 누르면 방금전에 입력했던 std::가 입력될것이다.

기본 사용 법 (Insert Mode)
-----------------------------------------------------------------------------------------------


기본 사용 법 (Visual Mode)
-----------------------------------------------------------------------------------------------


기본 사용 법 (Command Mode)
-----------------------------------------------------------------------------------------------



고급 사용법 (Normal Mode)
-----------------------------------------------------------------------------------------------
   - 나뉘어진 창 두개를 switch 하기 : ctrl-w 그다음 r
      (주의 : 스위치할 반대편 창이 나뉘면 회전 안됨)

   - 반대편 괄호로 이동
       1. {} 괄호의 처음으로 이동 : [{
       2. {} 괄호의   끝으로 이동 : ]}
       3. () 괄호의 처음으로 이동 : [(
       4. () 괄호의   끝으로 이동 : ])

   - 특정 범위 접기 펴기
       1. 접기 : v 관련 녀석으로 범위를 설정z + f
       2. 펴기 : 접은 위치에서 z o

   - 북마크 하기
       1. 한문서 내에서 북마크 설정 : m + [a~z]
       2. 한문서 내에서 설정한 북마크로 이동 : ' (엔터키 옆의 작은따옴표) + 설정한 소문자
       3. 여러 문서 사이의 북마크 설정 : m + [A~Z]
       4. 여러 문서 사이의 이동 : ' + 설정한 대문자

   - 매크로 등록 및 사용 : 매크로는 에디터를 종료해도 저장된다.
       1. 매크로 등록 : q + 단축키 + 당신의 행동 + q
       2. 매크로 사용 : @ + 단축키

   - 현재커서의 단어를 색인대상으로 잡기 : #

   - 버퍼에 로드된 파일 닫기(버퍼 번호는 바뀌지 않는다) : :wb

Introduction
----------------------------------------------------------------------------------------------
  기존의 swap은 어떤 타입이든(대입 연산자 '=' 를 이용할 수 있다면) 가능한 std 범용 함수이다. 하지만 클래스 내부 멤버 변수가 엄청나게 큰 데이터를 가지고 있다면, 복사에 드는 비용은 실로 어마어마하다고 할 수 있다. 이런경우 두 객체의 멤버 변수 포인트만 바꿔주는, 기존의 동작과는 약간 다른 특화된 swap을 만들 필요가 있다. 지금부터 설명하고자 하는 특화된 swap에 대한 방법은 Effective c++에서 소개한 방법을 인용하기로 한다.

Before implementing specialized swap function
----------------------------------------------------------------------------------------------

    1. 표준 제공 swap함수의 성능이 내가 만든 클래스에서 만족할 만한 성능을 지니면
       그냥 쓴다.

    2. 그렇지 않은 경우 클래스 내부에 swap 멤버 함수를 퍼블릭으로 선언하라. 그리고
       그 안에는 빠른 swap 알고리즘을 기술한다.

       (예) MyClass {
            public:
                ...
                swap(MyClass target) { // Write Fast swap algo }
            private:
                ...
           };

    3. 내가 구현한 클래스를 둘러싸고 있는 네임스페이스 안에 swap 함수를 많들어 넣고
       이 함수 안에서 MyClass에서 만든 swap 멤버 함수를 호출하도록 만든다.

        namespace MyNamespace
        {
             ...
             MyClass {
                 ...
             };
             ...
             void swap(MyClass& a, MyClass& b)
             {
                  a.swap(b);
             }
        } // end - MyNamespace
      
  < Suggestion > swap은 절대로 예외를 발생시키자 않도록 만들어라. swap은 예외 발생시 이전상태로 돌릴수 있게 응용할 수 있는 강력한 함수이기 때문에(strong- exception-safety guarantee) 예외를 던지지 않게 설계한다면 유용하게 이용할 수 있을 것이다.

Before Introduction of the casting
--------------------------------------------------------------------------------------------

Casting에 대한 설명 전에 당부하고 싶은 말은, 되도록 Casting 횟수를 최소화 하라는 것이다. 왜냐하면 Casting을 하다보면 틀린 코드를 쓰고도 모르는 경우가 발생할 수 있으며, Casting시 Overhead가 있기 때문이다. 꼭 필요한 것인지 다시한번 생각해볼 필요가 있는 녀석이다.

또하나 당부하고 싶은 말은, 구형스타일의 캐스트를 쓰려거든 (예) (int)32.353 C++스타일의 캐스트를 사용하라는 것이다. 코드상에서 캐스팅 영역을 발견하기도 편하고, 그로 인해 프로그래머의 의도를 좀더 쉽게 파악할 수 있기 때문이다.



Introduction & Details of the casting
--------------------------------------------------------------------------------------------

0. How to Use 

        : xxx_cast<변환타입>(변환할값)

1. static_cast

     : 일반적인 C 형태의 캐스팅이라고 생각하면된다. 변환 자료형을 써줄 필요가 없고, 특정
       자료형으로 강제로 변환하고자 할 경우에는 <> 를 이용한다.(되도록 자료형을 써주자)
       위험한 형변환시 (할당되지 않은 영역까지 침범하는 캐스팅) 에러를 발생시킨다. 하지만
       런타임시 변환에 대한 안전성보장을 하지 않으므로, dynamic_cast와 이것중 뭘 선택해야
       하는지는 프로그래머에 달려있다.

 (예1) double d = 2.3; int i = static_cast(d);
 (예2) void *b = malloc(sizeof(int) * 3); int* pi = static_cast<int>(b);

2. const_cast

      : const 형 포인터의 const 를 벗기기 위해 사용한다. 혹은 Volatileness를 제거하는 용도로도
        쓰인다.

 (예1) const int* t = new int[2]; int* e = const_cast(t);

3. reinterpret_cast

       : 전혀 관계없는 타입끼리의 캐스팅에 사용하는 강제형변환의 하나이다. Low Level에서 이용
         되며, 적용결과는 구현환경에 의존적이다(다시말해 이식성이 없다.) Low Level 제어이외에는
         사용을 금해야 하는 casting 연산자이다.

 (예1) void *b = malloc(sizeof(int) * 3); int* pi = reinterpret_cast<int>(p);

4. dynamic_cast

        : 주로 주어진 객체가 어떤 클래스 상속계통에 속한 타입인지를 결정하는 작업에 쓰인다.
          (Pointer 나 Reference)
 
          왜냐하면 캐스팅할 객체가 캐스팅 목표 객체로 변환 가능하면 그 타입의 포인터를 리턴하고
          실패하면 NULL을 리턴하기 때문이다. 상당히 신경쓰일 정도로 런타임 비용이 높은 캐스팅
          연산자이다. 캐스팅 가능여부를 판단하기위해 그 객체를 조사하게 되는데, 상속깊이가 깊거나
          다중상속이라도 쓰게 된다면 오버헤드가 크게 된다. 수행성능에 민감한 프로그램의 경우
          이 녀석의 사용에 신중을 기하자.


  1. noaster 2008.02.16 01:04 신고

    음 나는 클래스 포인터는 dynamic
    나머지는 다 static
    쓰지

  2. Favicon of http://finsternis.tistory.com BlogIcon leanu 2008.02.16 10:28 신고

    맞아~! 예전에도 프로세스 죽는거 보니까 리턴 클래스가 NULL일때 그냥 맴버함수 접근하는 경우가 많더라고. dynamic 쓰는게 좋을꺼 같네~!

이곳을 방문하라

http://www.fileinfo.net

아는 사람들도 있겠지만

0일때 1로 바꾸고 1일때 0으로 바꾸는 (일종의 flag on/off)

방법을 하나 알려주고자 한다.

int i = 0;

i = i ^ 1;  // i 값이 0 -> 1 로 바뀐다.

i = i ^ 1;  // i 값이 1 -> 0 로 바뀐다.

i = i ^ 1;  // i 값이 0 -> 1 로 바뀐다.


exclusive or 연산을 이용한 방법인데

if 문을 통해 값을 변경하는 사람들이 꽤 될 것 같아서 올린다.

[함수설명]

함수의 원형 :    DIR *opendir(const char *dirname);
함수의 원형 :    struct dirent *readdir(DIR *dirp);
함수의 원형 :    int closedir(DIR *dirp);

[기본 예제]

 #include <stdio.h>
 #include <sys/types.h>
 #include <dirent.h>


 int main(int argc, char *argv[])
 {
     DIR *p_dir  = NULL;
     struct dirent *p_dir_info;

     if(argc <= 1) printf("사용법: ShowDir <path>\n");
     else {
         p_dir = opendir(argv[1]); // argv[1]의 경로의 디렉토리에 대한 핸들을 얻는다.
         if(p_dir == NULL) printf("경로명에 문제가 있습니다. - %s\n", argv[1]);
         else {
             while((p_dir_info = readdir(p_dir)) != NULL){ // 디렉토리에 있는 파일 정보 얻는다.
                 printf("%s\n", p_dir_info->d_name);
             }
             closedir(p_dir); // opendir로 얻은 핸들을 닫는다.
         }
     }

     return 1;
 }

Name Description
ASCII() Return numeric value of left-most character
BIN() Return a string representation of the argument
BIT_LENGTH() Return length of argument in bits
CHAR_LENGTH() Return number of characters in argument
CHAR() Return the character for each integer passed
CHARACTER_LENGTH() A synonym for CHAR_LENGTH()
CONCAT_WS() Return concatenate with separator
CONCAT() Return concatenated string
ELT() Return string at index number
<=> NULL-safe equal to operator
= Equal operator
EXPORT_SET() Return a string such that for every bit set in the value bits, you get an on string and for every unset bit, you get an off string
FIELD() Return the index (position) of the first argument in the subsequent arguments
FIND_IN_SET() Return the index position of the first argument within the second argument
FORMAT() Return a number formatted to specified number of decimal places
>= Greater than or equal operator
> Greater than operator
HEX() Return a hexadecimal representation of a decimal or string value
INSERT() Insert a substring at the specified position up to the specified number of characters
INSTR() Return the index of the first occurrence of substring
IS NULL NULL value test
LCASE() Synonym for LOWER()
LEFT() Return the leftmost number of characters as specified
LENGTH() Return the length of a string in bytes
<= Less than or equal operator
< Less than operator
LIKE Simple pattern matching
LOAD_FILE() Load the named file
LOCATE() Return the position of the first occurrence of substring
LOWER() Return the argument in lowercase
LPAD() Return the string argument, left-padded with the specified string
LTRIM() Remove leading spaces
MAKE_SET() Return a set of comma-separated strings that have the corresponding bit in bits set
MATCH Perform full-text search
MID() Return a substring starting from the specified position
!=, <> Not equal operator
NOT LIKE Negation of simple pattern matching
NOT REGEXP Negation of REGEXP
OCTET_LENGTH() A synonym for LENGTH()
ORD() If the leftmost character of the argument is a multi-byte character, returns the code for that character
POSITION() A synonym for LOCATE()
QUOTE() Escape the argument for use in an SQL statement
REGEXP Pattern matching using regular expressions
REPEAT() Repeat a string the specified number of times
REPLACE() Replace occurrences of a specified string
REVERSE() Reverse the characters in a string
RIGHT() Return the specified rightmost number of characters
RLIKE Synonym for REGEXP
RPAD() Append string the specified number of times
RTRIM() Remove trailing spaces
SOUNDEX() Return a soundex string
SOUNDS LIKE(v4.1.0) Compare sounds
SPACE() Return a string of the specified number of spaces
STRCMP() Compare two strings
SUBSTRING_INDEX() Return a substring from a string before the specified number of occurrences of the delimiter
SUBSTRING(), SUBSTR() Return the substring as specified
TRIM() Remove leading and trailing spaces
UCASE() Synonym for UPPER()
UNHEX()(v4.1.2) Convert each pair of hexadecimal digits to a character
UPPER() Convert to uppercase
<port 1234 를 udp로 open>
sudo iptables -A INPUT -p udp --dport 1234 -j ACCEPT

<port 1234 를 close>
sudo iptables -A INPUT -p udp --dport 1234 -j DROP


ps.1 unix 나 다른버전의 linux 인경우 root 계정으로 로그인한 후 sudo 를 뺀 나머지를 입력하면된다.

ps.2 tcp로 열고 싶은경우 udp -> tcp 로 바꾸어 주면 된다.
#include <time.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

int main()
{
    struct timeval mytime;

    // 현재 시간을 ms 단위로 얻어온다.
    gettimeofday(&mytime, NULL);
    printf("%ld:%ld\n", mytime.tv_sec, mytime.tv_usec);

    // 시간을 알기 쉽게 출력한다.
    // 시간에 9를 더한 이유는 GMT를 기준으로 9시간 더 지난 시간이기 때문
    struct   tm *tm_ptr;
    tm_ptr = gmtime(&mytime.tv_sec);
    printf("현재시간 : %d년 %d월 %d일 %d:%d\n",
            tm_ptr->tm_year + 1900, tm_ptr->tm_mon +1,
            tm_ptr->tm_mday, tm_ptr->tm_hour+9,
            tm_ptr->tm_min);

    return 0;
}

+ Recent posts

티스토리 툴바