Turbo-C
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
터보-C 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
Lua 게시판
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C/C++ Q/A
[5971] Re:Re:volatile 변수의 void 포인터 캐스팅
서영섭 [syseop] 5637 읽음    2007-03-31 16:48
volatile을 사용할경우 컴파일러의 해석이 어떻게 되는지는잘 알고 계시리라 생각됩니다.
허나이 volatile 변수가 함수에 전달될때 특히 포인터로 전달될때는 범용적으로 만들어진 함수의 경우
입력변수들을 volatile로 잡지 않았을것입니다. 이경우 이함수내에서는 volatile변수가 넘겨젔다하더라도
해당 함수내에서는 volatile의 성격을 잃게 되는것이죠.. 아마도 이것을 경고하는 것일 것입니다.
그리하여 함수자체도 volatile변수로 입력을 선언할경우 워닝이 사라지는것이구요.
꼭 해당함수 내에서 volatile성격이 필요없으시다면 cast연산자를 사용하여 형변환 하시는것이 좋을 듯하네요.


라스코니 님이 쓰신 글 :
: 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는 서로 다른 데이터 형이라서 그렇다는군요.

+ -

관련 글 리스트
5839 volatile 변수의 void 포인터 캐스팅 권기식.with☆ 5687 2006/10/25
5859     Re:volatile 변수의 void 포인터 캐스팅 라스코니 4079 2006/11/08
5971         Re:Re:volatile 변수의 void 포인터 캐스팅 서영섭 5637 2007/03/31
5861         Re:Re:volatile 변수의 void 포인터 캐스팅 권기식.with☆ 3912 2006/11/08
5846     Re:volatile 변수의 void 포인터 캐스팅 남병철.레조 3185 2006/11/04
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.