C/C++프로 그래 밍 소감

http://antkillerfarm.github.io/
참고 자료
http://www.cplusplus.com/
이 사 이 트 는 C++의 표준 라 이브 러 리 의 용법 을 찾 을 수 있다.
헤더 파일 이 여러 원본 파일 에 참조 되 었 습 니 다.
헤더 파일 에서 문자열 을 정의 할 때 이 헤더 파일 이 여러 원본 파일 에 인 용 될 경우 문자열 은 const 로 정의 되 어야 합 니 다.그렇지 않 으 면 다시 정의 하 는 오류 가 발생 할 수 있 습 니 다.물론 헤더 파일 에 성명 만 넣 고 정 의 를 내리 지 않 는 것 이 좋 습 니 다.
사용
#ifndef _COMMON_STRING_
#define _COMMON_STRING_
...
...
...
#endif

이 문 제 를 해결 할 수 없다.이 코드 는 같은 원본 파일 이 헤더 파일 을 반복 하 는 문 제 를 해결 하기 때문이다.이 문 제 는 서로 다른 원본 파일 이 같은 파일 을 포함 할 때 발생 하 는 중복 정의 문제 입 니 다.const 키 워드 는 같은 식별 자 를 한 번 만 정의 할 수 있 도록 보장 합 니 다.
포인터 배열 과 배열 포인터int (*p)[10]먼저*p가 역할 을 하고 하나의 지침(p 는 틀림없이 지침)을 설명 한 다음 에[10](배열 설명)이 고 p 는 10 개의 성형 요소 로 구 성 된 배열 을 가리 키 는 지침 이다.배열 포인터.
만약int *p[10]이 라면 먼저[]가 사용 되 고 그것 은 배열 이다.그 다음 에*이기 때문에 이 배열 요 소 는 지침 형 입 니 다.-포인터 배열.
설명 하 다
    int a[10];
    printf("%x
"
,&a); printf("%x
"
,a);

&a 와 a 의 값 은 같 지만 의 미 는 다르다.a 는int *p에 해당 하고&a 는int (*p)[10]에 해당 한다.
유사 하 다int (*p[])(int)함수 포인터 배열.int (*p())[]배열 포인터 의 함 수 를 되 돌려 줍 니 다.int *p()[]말 그대로 포인터 배열 을 되 돌려 주 는 함수 로 해석 할 수 있 지만 함 수 는 배열 로 돌아 갈 수 없습니다.int *(*a())()이것 은 함수 입 니 다.매개 변수 가 없습니다.반환 값 은 함수 포인터 입 니 다.이 포인터 가 가리 키 는 함수 도 없고 매개 변수 도 없 으 며 반환 값 은 int 형의 지침 입 니 다.
임 베 디 드 프로그래머 가 알 아야 할 몇 가지 기본 적 인 문제
http://linux.chinaitlab.com/c/713810.html
C++의 mutable 키 워드 를 깊이 이해 합 니 다.
http://dev.yesky.com/393/3007393.shtml
UNREFERENCED_PARAMETER 의 역할
http://blog.csdn.net/apunix/archive/2008/01/14/2043945.aspx
sizeof 구조 체 크기 판단
http://blog.csdn.net/van150/archive/2005/12/05/544454.aspx
VC 의 기본 규칙 은 기본적으로 위 와 같이 gcc 의 기본 규칙 은 4 바이트 정렬 입 니 다.
비교 해 볼 수 있어 요.
struct s
{
  char a;
  double b;
  int c;
}

...과
struct s
{
  char a;
  int b;
  double c;
}

각 플랫폼 의 size of 값 입 니 다.
다음 코드 세 션 을 보면 놀 라 지 말 라 고 덧 붙 였 다.
typedef enum _XXX
{
    XXX_0        = 0,
    XXX_1        = 1,
    XXX_FORCE_DWORD    = 0x7FFFFFFF/*       */
}XXX;

바이트 정렬 설정
1)컴 파 일 러 옵션 지정
VC:/Zp
gcc:-fpack-struct
2)코드 지정
VC 와 gcc 모두 사용 가능#pragma pack(4)gcc 아직 사용 가능__attribute__((packed))자바 에서 대상 을 만 들 때 코드 실행 순서(이 문제 C++도 존재 할 것 입 니 다)
http://jacob777.blog.sohu.com/106426297.html
함 수 를 넓 게 펼 치 는 작은 기교
어떤 때 는 매크로 전개 방식 으로'위'함 수 를 정의 합 니 다.
이러한"위조"함 수 는 다음 과 같은 특징 이 있다.
  • 진정한 함수 가 아니 라 매개 변 수 를 받 아들 이 는 매크로 입 니 다.
  • 형식 상 일반 함수 와 같다.

  • 이 기능 을 실현 하기 위해 교과서 에서 제시 한 방법 은 다음 과 같다.
    #define st(x)      do { x } while (0)
    #define HAL_DMA_SET_SOURCE( pDesc, src ) \
      st( \
        pDesc->srcAddrH = (uint8)((uint16)(src) >> 8); \
        pDesc->srcAddrL = (uint8)( (uint16)(src) & 0xFF ); \
      )

    그러나do { x } while (0)일부 컴 파일 러 에 warning 을 알 린 다.최근 에 Ti 코드 를 봤 을 때 더 좋 은 방법 을 봤 어 요.
    #define st(x)      do { x } while (__LINE__ == -1)

    C++11 의 새로운 기능
    저 는 2003 년 이후 C++를 배 웠 습 니 다.2009 년 까지 C++는 제 주요 업무 언어 였 습 니 다.그러나 본인 이 먼저 배 운 C 언어 이기 때문에 프로 그래 밍 의 사상 은 함수 식 이 었 다.C,C++,자바,C\#,Matlab,Python 을 사용 하 더 라 도 스타일 이 많이 다 르 지 않 습 니 다.이것 도 나중에 내 가 GTK 에 대한 애정 이 각별 한 중요 한 원인 이다.
    전반적 으로 말 하면,나 는 C++에 대해 많이 썼 지만,이해 하 는 것 은 깊 지 않다.단일 계승,구성원 함수 의 패 키 징,방문 과 같은 개념 에 대해 서 만 어느 정도 인식 하고 사용 합 니 다.다 중 계승,템 플 릿 은 쓸 지 안 쓸 지 볼 수 있 습 니 다.C++03 과 C++11 의 새로운 특성 은 말 할 필요 도 없다.최근 에 Cocos2d-x 를 연구 하기 때문에 이러한 새로운 특성 을 접 하 게 되 어 자신 이 이미 골동품 이라는 것 을 꽤 느 꼈 다.
    다행히 자바 언어 는 괜 찮 습 니 다.대부분의 C++새로운 특성 은 배 워 도 어렵 지 않 습 니 다.
    1.auto 키워드
    C++11 에 도 입 된 auto 는 주로 두 가지 용도 가 있 습 니 다.자동 유형 추정 과 반환 값 이 차지 합 니 다.auto 는 C++98 에서 임시 변 수 를 표시 하 는 의 미 는 사용 이 매우 적 고 불필요 하기 때문에 C++11 에서 삭제 되 었 습 니 다.앞 뒤 두 표준 의 auto 는 완전히 두 개념 이라는 점 에서 특히 주의해 야 한다.
    http://blog.csdn.net/huang_xw/article/details/8760403
    2.nullprt 도입
    http://blog.csdn.net/huang_xw/article/details/8764346
    3.모방 함수,lambda 표현 식 과 패키지 닫 기
    http://www.cnblogs.com/npbool/p/3434757.html
    4.C++,자바,C\#lambda 표현 식 형식
    C++ auto func = [=](int x, int y)->int {return x * y;};
    Java Runnable r1 = (int x, int y) -> { return x * y; }
    C# Func towParams = (x, y) => x * y
    폐기 알림 추가
    일부 라 이브 러 리 는 호환성 을 고려 하여 여전히 구 함수 에 대한 지원 을 보류 하고 있다.그러나 이 함수 들 을 계속 사용 하 는 것 은 작가 의 취지 가 아 닌 것 이 분명 하 다.따라서 컴 파일 할 때 폐 기 된 힌트 를 줄 필요 가 있다.
    최근 cocos2d-x v3 코드 를 찾 아 보 니 이렇게 할 수 있 습 니 다.
    매크로 정의:
    #if defined(__GNUC__) && ((__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 1)))
    #define CC_DEPRECATED_ATTRIBUTE __attribute__((deprecated))
    #elif _MSC_VER >= 1400 //vs 2005 or higher
    #define CC_DEPRECATED_ATTRIBUTE __declspec(deprecated)
    #else
    #define CC_DEPRECATED_ATTRIBUTE
    #endif

    매크로 사용:CC_DEPRECATED_ATTRIBUTE static TextureCache * getInstance();
    인용 에 대한 일반적인 오류
    class Base
    {
      public:
        void something(Base& b){}
    };
    
    int main()
    {
      Base b;
      b.something(Base());
      return 0;           
    }

    위의 코드 는 컴 파일 할 때 다음 과 같은 오류 정보 가 발생 합 니 다.
    abc.cpp:12:20: error: no matching function for call toBase::something(Base)abc.cpp:12:20: note: candidate is:
    abc.cpp:6:7: note: void Base::something(Base&)
    abc.cpp:6:7: note: no known conversion for argument 1 fromBasetoBase&’

    이것 은Base()임시 변 수 를 생 성 했 기 때문에 이 값 을 non-const 에 인용 하면 안 됩 니 다.
    해결책 은void something(const Base& b){}
    다음 글 을 참고 할 수 있 습 니 다.
    http://stackoverflow.com/questions/20247525/about-c-conversion-no-known-conversion-for-argument-1-from-some-class-to
    상용 libc 구현
    libc 는 C 언어 표준 라 이브 러 리 의 약칭 으로 여러 가지 실현 이 있다.가장 많이 사용 되 는 gcc 자체 의 glibc 외 에 도 musl,uClibc,dietlibc 등 이 있다.
    http://www.etalabs.net/compare_libcs.html
    이 사 이 트 는 상기 4 가지 libc 가 실현 한 비교 결과 이다.결과적으로 musl 은 투자 가치 가 있다.실제로 최근(2015.5)OpenWrt 프로젝트 는 libc 를 uClibc 에서 musl 로 바 꿨 다.나 도 이 때문에 musl 을 알 게 되 었 다.
    물론 이 시 계 는 완전 하지 않 습 니 다.다른 libc 는 참고 할 수 있 습 니 다.
    https://en.wikipedia.org/wiki/C_standard_library
    배열 정의 의 할당 방법
    struct mtd_partition {
        const char *name;       /* identifier string */
        uint64_t size;          /* partition size */
        uint64_t offset;        /* offset within the master MTD space */
    };
    
    static struct mtd_partition parts[] = {
          {name: "boot", offset: 0,           size:0x500000,},
          {name: "setting", offset: 0x500000, size:0x300000,},
          {name: "linux", offset: 0x800000,   size:0x500000,}, 
          {name: "config", offset: 0xd00000,   size:0x100000,}, 
          {name: "rootfs", offset: 0xe00000,  size:0x3200000,},
          {name: "app", offset: 0x4e00000, size:0x800000,},
    
    };
    
    static struct resource pxa27x_resource_ohci[] = {
        [0] = {
            .start  = 0x4C000000,
            .end    = 0x4C00ff6f,
            .flags  = IORESOURCE_MEM,
        },
        [1] = {
            .start  = IRQ_USBH1,
            .end    = IRQ_USBH1,
            .flags  = IORESOURCE_IRQ,
        },
    };

    이 방법 들 은 C 의 그 기준 이 도 입 된 것 은 모 르 지만 코드 가 이렇게 사용 되 는 것 을 보 았 다.
    switch…case
    switch (reg) {
           case TAS5086_CLOCK_CONTROL ... TAS5086_BKNDERR:
           return 1;
           case TAS5086_INPUT_MUX:
           case TAS5086_PWM_OUTPUT_MUX:
           return 4;
    }

    위의 방법 으로 케이스 문 구 를 적 게 쓸 수 있다.
    동적 연결
    이틀 동안 Liux 에서 동적 링크 를 만 드 는 방법 을 실천 했다.인터넷 의 자료 가 비록 상세 하고 확실 하지만 여전히 누락 된 점 이 있 는 것 같다.
    1)g++와 gcc 의 차이
    원래 링크 만 주 려 고 했 는데,이것 은 나의 오리지널 이 아니 라 는 것 을 보 여 주 려 고 했다.하지만 지금의 링크 는 너무 빨리 효력 을 잃 었 다...멘 붕.
    화려 한 구분자 로 인용 내용 을 표시 할 수 밖 에 없 었 다.
    오류 1:gcc 는 c 코드 만 컴 파일 할 수 있 고 g+는 c+코드 만 컴 파일 할 수 있 습 니 다.
    둘 다 가능 하지만 주의 하 세 요.
    1.접미사 가 c 인 경우 gcc 는 C 프로그램 이 라 고 생각 하고 g+는 c+프로그램 이 라 고 생각 합 니 다.접 두 사 는.cpp 입 니 다.둘 다 c+프로그램 이 라 고 생각 합 니 다.c++는 c 의 초 집합 이지 만 문법 에 대한 요 구 는 차이 가 있 습 니 다.C++의 문법 규칙 은 더욱 엄밀 하 다.
    2.컴 파일 단계 에서 g++는 gcc 를 호출 합 니 다.c+코드 에 대해 둘 은 등가 입 니 다.그러나 gcc 명령 은 C++프로그램 이 사용 하 는 라 이브 러 리 와 자동 으로 연결 되 지 않 기 때문에 보통 g++로 링크 를 완성 합 니 다.통일 을 위해 아예 컴 파일/링크 는 모두 g++를 사용 합 니 다.이것 은 cpp 프로그램 이 g++만 사용 할 수 있 는 것 처럼 착각 합 니 다.
    오류 2:gcc 는 정의 하지 않 습 니 다cplusplus 매크로,g+회
    실제로 이 매크로 는 컴 파일 러 가 코드 를 C 또는 C+문법 으로 해석 하 는 것 을 상징 할 뿐이다.상기 와 같이 접미사 가 c 이 고 gcc 컴 파일 러 를 사용 하면 이 매크로 는 정의 되 지 않 은 것 이 고 그렇지 않 으 면 정 의 된 것 이다.
    오류 3:컴 파일 은 gcc 만 사용 할 수 있 고 링크 는 g++만 사용 할 수 있 습 니 다.
    엄 밀 히 말 하면 이 말 은 잘못된 것 이 아니 지만 개념 을 헷 갈 렸 습 니 다.컴 파일 은 gcc/g+를 사용 할 수 있 고 링크 는 g+또는 gcc-lstdc+를 사용 할 수 있 습 니 다.gcc 명령 은 C++프로그램 이 사용 하 는 라 이브 러 리 와 자동 으로 연결 되 지 않 기 때문에 보통 g++를 사용 하여 연결 을 완성 합 니 다.그러나 컴 파일 단계 에서 g++는 gcc,양자 등 가 를 자동 으로 호출 합 니 다.
    따라서,때로는 편집 할 수 없 을 때,cc 의 값 을 바 꿔 볼 수 있 습 니 다.
    2)gcc 4.1.1 에서 유형 검사 가 엄격 한 것 같 습 니 다.dlsym 에서 돌아 오 는 void*형식 은 해당 하 는 함수 포인터 형식 으로 바 꿀 수 없고 강제 변환 이 필요 합 니 다.어떤 인터넷 의 예 들 은 여기에서 지 어 낼 수 없다.
    3)명시 적 호출 시 동적 라 이브 러 리 함수 의 성명 에 주의해 야 합 니 다.extern "C"을 추가 해 야 정상적으로 실 행 될 수 있 습 니 다.(명시 적 호출 은 실행 할 때 불 러 오기 때문에 컴 파일 이 가능 하지만 실행 이 잘못 되 었 습 니 다.)문제 의 소 재 를 확인 하기 위해 nm 명령 으로 링크 라 이브 러 리 의 기호 표를 볼 수 있 습 니 다.
    4)링크 할 때 파일 의 순 서 를 주의해 야 한다.
    예 를 들 어 다음 의 예:
    https://github.com/antkillerfarm/antkillerfarm_crazy/tree/master/helloworld/linux_so gcc -o main_link main_link.c -L. -lhello
    이 명령 의 mainlink.c 를-lhello에 넣 으 면 문제 가 생 길 수 있 습 니 다.--start-group--end-group같은 링크 옵션 을 사용 하여 링크 순서 문 제 를 해결 하 는 것 도 고려 합 니 다.
    cout 포맷 출력
    cout<//       
    cout<//      
    cout<//      

    strtok
    strtok 함 수 는 문자열 을 분할 하 는 데 많이 사용 되 지만 분 단 된 문자열 의 값 을 바 꿉 니 다.따라서 이 문자열 이 나중에 도 유용 하 다 면 먼저 이 문자열 을 복사 한 다음 복사 한 문자열 에 대해 strtok 함 수 를 실행 해 야 합 니 다.
    K&R 스타일
    C 언어의 함수 정의 에 있어 서,우리 가 일반적으로 사용 하 는 함수 정의 방식 은 ANSI C 의 함수 정의 방식 이다.그러나 C 언어의 아버지 가 C 언어 를 만 들 었 을 때 함수 의 정의 형식 은 현재 우리 가 볼 수 있 는 형식 이 아니다.
    이런 스타일 은 K&R 스타일 이 라 고 불 리 며 역사가 유구 한 프로젝트 나 오래된 책 에서 많이 볼 수 있다.호환성 을 고려 하여 현대 의 C 컴 파 일 러 는 여전히 K&R 스타일 을 지원 한다.
    자세 한 내용 은:
    http://blog.chinaunix.net/uid-7426920-id-2627743.html

    좋은 웹페이지 즐겨찾기