const static 함수...

ppappa의 이미지

const function() { ... }
static function() { ... }
const static function() { ... }

이 세 함수의 차이가 뭔지 정확히 잘 모르겠습니다.
간단하게 설명좀 해주시면 감사하겠습니다.
아시는분 답변좀 부탁드려요. ^^

pynoos의 이미지

C++ 의 멤버가 아닌 C 에서 말씀하시는 거죠?

const 는 function을 수식하지 않고 return type을 수식합니다.

static 은 function의 scope를 제한 합니다. 즉 file 단위로 제한합니다.

맨 위 검색이라는 조그마한 버튼을 이용해서 검색한번 해보시면 더 좋은 글들을 얻을 수 있습니다

ppappa의 이미지

답변 감사드립니다.
검색을 해봤는데도 쉽게 이해가 잘 안가서요...

static이 file scope이란건 잘 알겠습니다.
그런데 return type이 const라는 부분이 잘 이해가 안갑니다.
return된 값을 변경할 수 없다는 말인가요?
예를 들어
const int a;
const static int function();
a = function();

이 경우 function()의 return 값을 받는 const int a가
값을 받은 이후 변경되어서는 안된다는 말인가요?

pynoos의 이미지

네.. 맞습니다.
a 값은 바뀔 수 없는 것이죠.

전웅의 이미지

perihk wrote:
답변 감사드립니다.
검색을 해봤는데도 쉽게 이해가 잘 안가서요...

static이 file scope이란건 잘 알겠습니다.
그런데 return type이 const라는 부분이 잘 이해가 안갑니다.
return된 값을 변경할 수 없다는 말인가요?
예를 들어
const int a;
const static int function();
a = function();

이 경우 function()의 return 값을 받는 const int a가
값을 받은 이후 변경되어서는 안된다는 말인가요?

예가 잘못되었습니다. a 가 const int 형으로 선언되었으므로, a 에 초기화
가 아닌 방법으로 값을 대입할 수는 없습니다. 직접 실행해보시면 쉽게
그 결과를 알 수 있을 겁니다.

const 는 형한정어 (type qualifier) 이고, 형한정어는 정의상 lvalue
문맥에서만 유효합니다. 함수 반환값은 lvalue 가 아니므로 함수 반환형에
붙는 const 는 무의미합니다 - 다만, 함수형의 호환 여부 결정에는 영향을
미칩니다.

int a;    /* "just" INT */
const int foo();    /* function returning (const) INT */
int foo();    /* not compatible with the above; wrong */

a = foo();    /* no problem */

고로 함수 반환형에 const 나 volatile 을 사용하는 것은 의미 없이
프로그램을 복잡하게 만드는 것 뿐입니다.

물론, 어떤 함수가 포인터를 반환하고 형한정어가 포인터 값이 아닌
포인터를 한정하는데 사용한다면 이야기가 달라집니다.

int *pi;    /* POINTER TO INT */
const int *foo();    /* function returning POINTER TO CONST INT */

pi = foo();    /* wrong */

비교를 위해 포인터가 관련된 예를 처음 보였던 예와 유사하게 바꾸면,

int *pi;    /* "just" POINTER TO INT */
int * const foo();    /* function returning (const) POINTER TO INT */

pi = foo();    /* no problem */

제가 주석에 대문자로 쓴 부분을 위 아래 예에서 비교해보시면 그 차이가
더 분명해 질 것입니다.

C 언어의 type system 은 말로 풀어 설명할 경우 혼란스러울 수 있지만
수학 공식을 이해하듯 그 기본적인 규칙을 차근히 따라가면 아무리 복잡한
경우도 기계적으로 받아들일 수 있습니다.

그럼...

--
Jun, Woong (woong at gmail.com)
http://www.woong.org

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.