[질문] C에서 질문입니다.

innersys의 이미지

C에서 펑션앞에 static이 어떤역할을 하는지 궁금합니다.

_delspec(naked) void fun(int sample)
{
}
이런식으로 선언된 함수에서 앞의 _delspec(naked)가 어떤역할을
하는지 설명좀 부탁드립니다.

feelpassion의 이미지

static으로 선언해주면 프로그램이 시작될때부터 메모리 공간을 잡아놓고 시작합니다. dynamic이라불리는 보통의 변수 선언과는 차이가 있죠
dynamic으로 선언한 일반적인 변수들은 프로그램이 실행될 때마다 메모리 공간을 잡을 수도 있고 그렇지 않을 수도 있고 그런거죠... 그러나 static 변수는 미리 프로그램이 실행될때 잡혀있으므로 그 프로그램내에서는 어디에서나 참조가 가능합니다(그러나 통용적으로 한 함수 안에서만 사용합니다). 처음에 한 번만 초기화되므로 여러 다른 함수들에서 그 값을 변화시키면 누적되서 변화된다는 얘기입니다.

아래는 MFC 도움말입니다.
naked
Microsoft Specific —>

__declspec( naked ) declarator

For functions declared with the naked attribute, the compiler generates code without prolog and epilog code. You can use this feature to write your own prolog/epilog code using inline assembler code. Naked functions are particularly useful in writing virtual device drivers.

Because the naked attribute is relevant only to the definition of a function and is not a type modifier, naked functions use the C++ Extended Storage-Class Attributes syntax.

For related information, see __declspec The naked Attribute Argument Passing and Naming Conventions Naked Function Calls.

Example

This code defines a function with the naked attribute:

// Example of the naked attribute
__declspec( naked ) int func( formal_parameters )
{
// Function body
}

END Microsoft Specific

남으로 창을 내겠소.
밭이 한참갈이 괭이로 파고 호미론 김을 메지요.
구름이 꼬인다 갈리있소. 새들의 노래는 공으로 들으랴오.
강냉이가 익거든 와자셔도 좋소.
왜 사냐건 웃지요.

youlsa의 이미지

static 변수에 대한건 윗분 설명이 맞구요, static 함수는 클래스 내의 static 멤버들만을 억세스할수 있는걸로 알고 있습니다. 좀 헛갈리죠.

그리고 naked는 함수의 진입/진출부에 늘상 알아서 붙여주는 코드들을 직접 작성할때 붙여주는걸루 알고 있습니다.

=-=-=-=-=-=-=-=-=
http://youlsa.com

theuhm의 이미지

제가 알기로는,

1) static global variable은, external linkage를 갖지 않습니다. 곧, 외부 모듈에서 extern 키워드로 링크하여 사용하는 것이 불가능합니다.

2) static local variable은, 로컬 스코프를 갖는 변수를 전역 데이터 영역에 단 1번 생성합니다. 결국 함수의 호출 사이에서 수명이 유지됩니다.

3) static function은 external linkage를 갖지 않습니다. 결국, 외부 모듈에서 link하여 사용하는 것이 불가능합니다.

4) static member variable은, 클래스 스코프를 갖는 변수를 전역 데이터 영역에 단 1개 생성합니다. 결국 같은 클래스의 모든 객체 사이에 공유가 되는 변수가 됩니다.

5) static member function은 윗분 말씀대로, 객체의 static data member만을 참조할 수 있습니다.

static 키워드는 참으로 많은 곳에 붙일 수 있지만, 각 용법에서의 context가 판이하게 달라서 참으로 헷갈리는 키워드죠 -_- orthogonal하긴 하지만.. 읽기는 어렵다고나 할까요 -_-;;

..

feelpassion의 이미지

죄송... 저의 실수입니다^^;;

예를 들어...

void test(){
      static int count = 0;
      int  dcount = 0;

      count++; dcount++;
      printf("static count = %d,  dynaminc count = %d\n",count, dcount);
}

이런 함수를 메인함수에서 3번 호출한다면 static으로 선언된 변수에 대한 출력은 1,2,3으로 나타나고 dynamic변수에 대한 출력은 계속 1,1,1로 나타날 것입니다. 왜냐하면 static 변수는 한 번만 초기화 되기 때문입니다.

참고하세요~^^;;

남으로 창을 내겠소.
밭이 한참갈이 괭이로 파고 호미론 김을 메지요.
구름이 꼬인다 갈리있소. 새들의 노래는 공으로 들으랴오.
강냉이가 익거든 와자셔도 좋소.
왜 사냐건 웃지요.

댓글 달기

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 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • 사용할 수 있는 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>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • You can use Textile markup to format text.
  • 사용할 수 있는 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>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 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>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.