함수에 대한 질문....

익명 사용자의 이미지

안녕하세요..

함수를 쓸때..

void 함수이름(인자들)
{
.....
}

이런식으로 쓰잖아요.. 근데..

void 함수이름(aa)
int aa;
{
}

void 함수이름(int aa)
{
}

위 두개 함수의 차이점이 궁금합니다.
다른분들께 물어보니까.. 그냥 똑같다고는 하는데요..
혹시나 해서.. 뭔가 차이점이 있을거 같아서 이렇게 질문 올립니다.

차이점이 없다면.. "차이점 없음!" 이라는 답변이라두 해주세요.ㅜ.ㅜ

익명 사용자의 이미지

음.. 차이가 있다고도 없다고도 말할 수 있져.

코드 하나 만들어 봅니다.

void func1(aa)
int aa;
{
}

void func2(int aa)
{
}

main()
{
func1();
func2();
}

이거 컴파일 해 보심 func1()에서는 에러없이 넘어가지만
func2()에서는 에러 납니다.

func1()은 옛날 C (K&R) 방식임다.
이 경우 컴파일러는 함수의 프로토타입 중 아규먼트 리스트에
대해서 아무런 정보를 가지고 있지 않은 것으로 됩니다.
따라서 파라메터를 주건, 안주건, 여러개 주건 컴파일러에서는
신경을 안 씁니다.

func2()의 경우는 ANSI C 방식임다.
이 경우 컴파일러는 함수의 프로토타입 중 아규먼트 리스트에
대한 정보도 가지고 있으면서 이후 컴파일시 그 함수를 만나면
파라메터 체킹(파라메터수, 타입호환성)을 하며,
이미 선언된(정의는 선언을 수반합니다.) 함수 프로토타입과
틀리기 때문에 오류를 발생시킵니다.

그럼, 함수의 정의나 선언이 함수 사용시까지 안 나오게 되면?
컴파일러는 일단 그 함수의 리턴값이 int 라고 가정합니다.
아규먼트에 대해서는 아무런 가정을 하지 않습니다.
위의 소스에서 func1()과 func2()의 정의를 main() 함수 뒷쪽으로
가져가면 어떻게 될까여?
답은 func1() 컴파일할 때 리턴타입이 틀리다고 에러를 냅니다.
컴파일하면서 함수 정보가 없으니 int를 리턴한다고 가정했는데,
실제 함수를 만나보니 void 리턴이니 프로토타입이 안맞는 오류를
내는거져.
지송함다. 지금 확인해 보니 gcc는 오류가 아니라 경고를 내는군여.
십수년전 터보C 에서는 오류를 냈었슴다. 믿어주십셔.

그럼 func1()과 func2()의 정의를 main()함수 뒷쪽으로 가져가면
어케될까여? 함 해 보시기 바람돠.

C++에서는 함수를 쓸 때 그 함수의 프로토타입을 모르면
에러남돠. C에서는 없어도 걍 아까 말씀드린대로 가정하고 지나감돠.

미리 프로토타입 써주는 게 좋은 습관이라고 함돠.
그리고 말씀하신 두 가지 방식 중에는 void func2(int aa);
와 같은 형태가 타입 체킹(파라메터 숫자도 검사해 주는데)을
가능하게 해 주기 때문에 좋은 방식이라고 함돠.

머, 이런 문제만 아니라면 두 방식 모두 같은 효과를
얻을 수 있으니 같다고 우겨도 꼭 틀리다고 할 수는 없겠져.

즐프 하시기 바람돠!

미뉘 wrote..
안녕하세요..

함수를 쓸때..

void 함수이름(인자들)
{
.....
}

이런식으로 쓰잖아요.. 근데..

void 함수이름(aa)
int aa;
{
}

void 함수이름(int aa)
{
}

위 두개 함수의 차이점이 궁금합니다.
다른분들께 물어보니까.. 그냥 똑같다고는 하는데요..
혹시나 해서.. 뭔가 차이점이 있을거 같아서 이렇게 질문 올립니다.

차이점이 없다면.. "차이점 없음!" 이라는 답변이라두 해주
세요.ㅜ.ㅜ

익명 사용자의 이미지

아래 링크 설명 참조하세요.

http//myhome.hananet.net/~toto2001/Lectures/C_FAQ/Declarations%
20and%20Initializations/1_1.htm

주소창에 복사해서 붙이기 하세요.

댓글 달기

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