반응형
SMALL
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | // 한 비트 클리어 #define clear_bit(data,loc) ((data) &= ~(0x1<<(loc))) // 연속된 여러 비트 클리어 #define clear_bits(data, area, loc) ((data) &= ~((area)<<(loc))) // 한 비트 설정 #define set_bit(data, loc) ((data) |= (0x1<<(loc))) // 연속된 여러 비트 설정 #define set_bits(data, area, loc) ((data) |= ((area)<<(loc))) // 한 비트 반전 #define invert_bit(data,loc) ((data) ^=(0x1 <<(loc))) // 연속된 여러 비트 반전 #define invert_bits(data,area, loc) ((data) ^=((area) <<(loc))) // 비트 검사 #define check_bit(data,loc) ((data) & (0x1<<(loc))) // 비트 추출 #define extract_bits(data,area,loc) (((data)>>(loc)) & (area)) | cs |
매크로를 이용하면 매번 비트 연산을 할 때마다 고민할 필요가 없다. 그런데 편리한 매크로에는 빠지기 쉬운 함정이 있으니, 바로 치환 함정이다. 다음은 입력 받은 수를 더하는 매크로이다.
1 2 3 4 5 | #define ADD(X) X+X void main(void) { int k; k = -ADD(5); | cs |
위의 소스는 두 수의 합을 음수화 시키고자 하는 소스이다. 그런데 k를 출력해보면 0이 출력된다. 왜일까? 수식을 치환해보면 k = -5+5가 된다. 0이 출력되는 것은 당연하다. 그럼 정상적으로 작동시키려면 어떻게 해야할까? 매크로의 수식을 괄호로 묶어주어야 한다.
1 | #define ADD(X) (X + X) | cs |
하지만 아직도 함정이 남아있다. 다음 소스를 보자.
1 2 3 4 5 6 7 | #include <stdio.h> #define SQUARE(X) (X * X) void main(void) { int a = 2; printf("%d", SQUARE(a + 5)); } | cs |
이번 매크로는 제곱을 만들어준다. 49가 나오길 기대하고 만들었지만 결과는 17이 출력된다. 수식을 치환해보면 a+5*a+5가 된다. 무엇이 문제인지 보이는가? 원하는 수식은 (a+5)*(a*5)였지만 괄호가 빠져 a+(5*a)+5라는 수식으로 계산되었다. 이 코드를 수정하면 다음과 같다.
반응형
LIST
'개인자료 > 프로그래밍' 카테고리의 다른 글
[망고보드_STM32] LED On (1) | 2015.06.03 |
---|---|
망고보드(M32) 시리얼 케이블 만들기_Serial to 3Pin (0) | 2015.06.02 |
Embedded Reference (0) | 2015.06.02 |
ARM에 사용되는 Register (0) | 2015.06.01 |
임베디드 레시피 및 망고보드(Cortex M-3) 구입 (0) | 2015.05.29 |
[임베디드 C] 특정 비트 연산 (3) | 2015.05.17 |
[C언어] 인사말 정렬 프로그램 (0) | 2015.05.16 |
[C언어] 프로필 교환 프로그램 (0) | 2015.05.16 |
[C언어] 방명록 프로그램 (0) | 2015.05.15 |
[C언어] 지점별 실적관리 프로그램 (0) | 2015.05.15 |