struct indoe * 에서 왜 *하나만 달랑 적은건가요??

withpiano의 이미지

포인터 부분을 겁내고 겁냈는데, 이번데 다시 도전하게 되었습니다. 다름이 아니라, /linux/fs.h 에 있는 헤더파일의 struct에 대한 것입니다.

struct file_operation {
...
}

을 보면, 각각 구초제가 정의되어 있는데

int (*open)(struct inode *, strucr file *);
이런 함수들이 있더라고요.

이런 형식은, 함수를 포인터로 표현한다는 것은 알겠는데
괄호안의 struct inode *이것이 뭘 뜻하는 것인지 모르겠습니다.

대부분, struct inode 다음에 * 연산자 표시 다음에
struct inode *변수(struct inode *aaa)
struct inode *배열(struct inode *aa[] )
이렇게 쓰는 걸으로 알고 있는데

달랑 * 하나만 적은 것은 뭔 뜻인지..궁금합니다.

( 카테고리를 잘못 선택했군요. 죄송합니다 (--))

Forums: 
lsj0713의 이미지

일단, 이 글은 프로그래밍 Q&A 게시판에 올리는 것이 올바르다고 생각됩니다. 글의 주제에 맞는 게시판에 글을 올려주시기를 부탁드립니다.

int (*open)(struct inode *, strucr file *); 

일단 이것이 pointer to ..., 즉 함수에 대한 포인터를 선언하고 있다는 것은 알고 계실 것입니다.

선언(e.g. 함수선언)에서의 매개변수 리스트에는, 변수 이름을 빼먹어도 됩니다(!).

일단 함수 선언과 함수 선언에 대해서는 알고 계시리라 믿습니다.

int inc(int i);    // 함수 선언

int inc(int i) { return a + 1; }    // 함수 정의

예를 들자면 함수 정의가 int func(char arg1, int arg2, float arg3) { ... } 인 함수가 있을때, 함수 선언을 int func(char, int, float) 처럼 매개변수의 자료형만 적어줄 수 있습니다. 함수 선언이 있는 이유는 원래 함수에 매개변수들을 함수에 어떻게 넘겨주고 그 리턴값을 어떻게 받아올 것인가 (즉 함수 호출과 종료시에 내부적인 표현과 구현을 어떻게 할 것인가, 혹은 형식이 어떻게 되는가)를 함수가 사용되기 전에 미리 컴파일러에게 알려주기 위해서 입니다.

참고로 C 언어는 1-pass compiler가 가능하도록 만들어졌습니다. 소스 파일을 위에서부터 아래로 한번만 읽고서도 목적 코드가 생성 가능하다는 뜻입니다. php 같이 함수를 먼저 사용하고 그 뒤에 함수 정의가 와도 되는 언어들의 경우에는, 2-pass로 돌리거나 아니면 함수 호출 시에 C처럼 간단한 내부구현으로 매개변수를 전달할 수는 없겠지요. 이것이 C에서 함수를 사용하기 전에 반드시 선언이나 정의가 와야 하는 이유입니다. (...사실, C언어에서는 선언이나 정의 없이 함수를 사용하면 무조건 int func()로 취급합니다. 때문에 #include 없이 printf 함수를 사용해도 컴파일 시에 아무런 에러(gcc에서 -Wall 옵션 사용시에는 경고가 뜹니다) 메시지가 뜨지 않습니다. int printf()와 int printf( const char *format, ... )는 호환(?)되기 때문입니다.)

int (*open)(struct inode *arg1, strucr file *arg2); 

int (*open)(struct inode *, strucr file *); 

위의 두 선언은 완벽히 동일하다고 보시면 됩니다. 변수이름 arg1과 arg2는 주석 역할밖에는 하지 않습니다. 그리고, 오래되어서 기억이 가물가물한데 제 기억이 맞다면 함수 선언과 정의의 매개변수 리스트에서 꼭 변수 이름이 일치할 필요는 없습니다.

#include <stdio.h>

int func(char aaa, int bbb);
int main(void) { func('a', 321); return 0; }
int func(char a, int b) { return printf("%c %d", a, b); }

여담이지만, 윈도우용 C 컴파일러인 LCC-Win32의 경우에는 windows.h 에서 주석과 공백, 변수명을 모두 제거하여(즉, 파일 용량을 줄여서) 디스크 억세스를 줄임으로써 컴파일 속도를 올리는 테크닉을 사용했다는 기사를 몇년전에 읽은적이 있습니다. 하도 오래되어서 요새도 그런지는 잘 모르겠습니다만... 어쨌든 일반 프로그래머가 섣불리 따라할만한 테크닉은 아니죠.

GunSmoke의 이미지

함수 선언입니다.
매개변수를 함수 정의에서 검사할 수 있도록 선언시에 그렇게 사용합니다.

大逆戰

withpiano의 이미지

아, 카테고리를 잘못 선택했군요. 죄송합니다.

쓰러지는 외모, 희사마

^____________^

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.