volatile이 단순한 키워드가 아닌것 같다는 말씀이 무슨 뜻인지....
volatile 을 그냥 써주신 건가요?
volatile은 컴파일러의 최적화를 방지하기 위해서 사용하는 겁니다. volatile을 사용하지 않는다면 컴파일러는 변수를 레지스터로 할당할수도 있거든요. 하드웨어 컨트롤 소프트웨어에서는 메모리 번지 자체를 I/O로 쓸수 있기 때문에 이런 경우에 해당하는 변수에 volatile을 쓸수 있습니다.
volatile char str[10]; 이라는 곳에서 volatile이 필요한지가 일단 의문이고요. char 로 선언하셨으면 char로, volatile char로 선언하셨으면 volatile char로 받아야 합니다.
memset((void *)str, 0, 10); 로 쓰는 것은 괜찮아 보입니다. 어짜피 포인터의 시작 주소가 중요한 것인지 void * 던지 volatile char * 던지 결과는 똑같습니다.
근데 저는 char str[10] 의 선언에서 volatile이 꼭 필요한지에 대한 재고가 필요하다고 보여지네요. 물론 대부분 레지스터의 수를 확보하기 위해서 volatile을 쓰곤 합니다.
권기식.with☆ 님이 쓰신 글 :
: 안녕하세요.
:
: avr-gcc로 마이크로 컨트롤러 프로그램을 짜다가 생긴 의문점인데 c 공통 사항인 것 같아 질문 드립니다.
:
: 예를 들어서...
:
: volatile char str[10];
:
: 이라고 변수를 선언했고.. 함수내에서 이를 0으로 초기화하기 위해 memset 함수를 사용했습니다.
:
: memset(str, 0, 10);
:
: 이렇게 하면 avr-gcc 컴파일러에서는 "passing argument 1 of 'memset' discards qualifiers from pointer target type" 이라는 경고 메시지를 띄우고 실행에는 문제가 없습니다.
:
: 이를 다시 Borland C++(Builder 2006)에서 컴파일해보니 volatile char *를 void *로 변환할 수 없다며 Error가 나네요.
:
: volatile... 단순히 생각할 키워드가 아닌 것 같네요.
:
: 어찌하여 이런 에러가 나며...
:
: memset((void *)str, 0, 10); 로 void * 형으로 캐스팅해서 쓰니 에러가 없어지는데 정상적인 해결책인지 궁금합니다.
:
: 포인터... 알면 알수록 어렵네요.. ^^
:
:
: ps. 같은 맥락으로 한 가지 더 적어봅니다.
:
: volatile로 선언된 변수의 경우 이를 인자로 넘겨받는 함수의 인자를 volatile로 선언하니 경고가 뜨지 않는군요.
:
: 자료를 좀 찾아보니 volatile char와 char는 서로 다른 데이터 형이라서 그렇다는군요.
|