C/C++프로 그래 밍 소감
참고 자료
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 to ‘Base::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 from ‘Base’ to ‘Base&’
이것 은
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.