printf 의 파라메타 내용

oprsystem의 이미지

안녕하세요

int
mon_printf(fmt,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12)
char *fmt;
int a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12;
{
    int ret;

    monLock();
    ret = _printf(fmt,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12);
    monUnlock();
    return(ret);
}

이런식으로 구현 되 있는 printf 가 있습니다.
int a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12;
이런식으로 변수를 선언하면 전역 변수가 되는것인지 어떤건지 확실히 모르겠습니다.
그리고 _printf 의 구현도 가변인자 방식이 아니라 고정 파라메타 방식처럼 보이는데 사용 할때는 일일이 파라메타13개를 다 넣는게 아니라 를 일반 printf 처럼 가변 파라메타 방식으로 사용하는것이 궁금합니다..

답변 부탁 드립니다.
:o

sangheon의 이미지

바람돌이 wrote:
안녕하세요

int
mon_printf(fmt,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12)
char *fmt;
int a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12;
{
    int ret;

    monLock();
    ret = _printf(fmt,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12);
    monUnlock();
    return(ret);
}

이런식으로 구현 되 있는 printf 가 있습니다.
int a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12;
이런식으로 변수를 선언하면 전역 변수가 되는것인지 어떤건지 확실히 모르겠습니다.
그리고 _printf 의 구현도 가변인자 방식이 아니라 고정 파라메타 방식처럼 보이는데 사용 할때는 일일이 파라메타13개를 다 넣는게 아니라 를 일반 printf 처럼 가변 파라메타 방식으로 사용하는것이 궁금합니다..

답변 부탁 드립니다.
:o

변수 선언을 Pre-ANSI C로 하시네요. 참고 서적을 ANSI-C에 맞춰진 것으로
바꾸세요.

그리고, 전역변수가 되지 않습니다.

가변 파라메터에 대해서는 역시 책에 잘 나와있습니다.
C 언어 쓰신다면 The C Programming Language 한권은 꼭 갖추시기
바랍니다. 번역서도 있습니다. 8)

--

Minimalist Programmer

oprsystem의 이미지

답변 감사 드립니다.

pre-ansi-C 군요.. 제가 잘못 알았습니다.
파라메타 입력의 선언인데.. 전역 변수라고 생각해 버렸습니다. 지적 고맙습니다.

그리고 제가 또하나 궁금한 점은 가변파라메타에 대해서가 아니라 어찌 해서
_printf(fmt,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12);

이 부분이 가변 파라메타처럼 사용되는가 하는 점 입니다.

감사 합니다.

황혼보다 어두운 자여
내 몸에 흐르는 피보다 더 붉은 자여
시간의 흐름 속에 파뭍힌 위대한 그대의 이름을 걸고 나 여기서 어둠에 맹세하노라
우리 앞을 가로막고 있는 모든 어리석은 자 들에게
나와 그대의 힘을
위대한 파멸의 힘을 보여줄 것을

juicy의 이미지

위의 bookworm(책벌레?^^) 님이 지적하셨듯이, Pre-ANSI C, 즉 옛날 방식이죠.. C 처음 나올때쯤(아마 20~30년전쯤) parameter를 저런 방식으로 썼었죠. 물론 전역변수는 아니죠.

oprsystem의 이미지

그렇다면 가변파라메타랑 동등한 방식이라는 말씀이시지요?

그렇다면 고정파라메타 수를 컴파일러가 검사 하는건가요?

황혼보다 어두운 자여
내 몸에 흐르는 피보다 더 붉은 자여
시간의 흐름 속에 파뭍힌 위대한 그대의 이름을 걸고 나 여기서 어둠에 맹세하노라
우리 앞을 가로막고 있는 모든 어리석은 자 들에게
나와 그대의 힘을
위대한 파멸의 힘을 보여줄 것을

Testors의 이미지

1. ANSI 이전의 C 는 아규먼트 타입검사를 안했으며

2. 심지어 아규먼트의 갯수도 검사 하지 않았습니다. -- 이건 가변인자의 경우 지금도 마찬가지 --

3. 그리고 아규먼트를 보통 sizeof(int) byte 씩 스택에 쌓아놓고 함수 호출한다는걸 이용한..

결코 권장할 만한 방법이 아닌.. 트릭입니다.

어짜피 C의 가변인자 자체가 타입검사가 불가능한 취약점을 가지고 있긴 하지만,

저런 방법은 그것보다 더 나쁩니다.

아규먼트 갯수도 12개로 제한되는군요.

(그리고 실수로 그 이상을 썼다고 해도 컴파일 타임에 잡아주지도 못하고..)

어지간하면 stdarg 의 매크로들을 이용하도록 하세요..

oprsystem의 이미지

답변 감사 드립니다.

아이디가 많이 보던 아이디라..

무한대전 테스토스님 맞으시죠? ^^*

또그 잡던 기억이 아련히~~

황혼보다 어두운 자여
내 몸에 흐르는 피보다 더 붉은 자여
시간의 흐름 속에 파뭍힌 위대한 그대의 이름을 걸고 나 여기서 어둠에 맹세하노라
우리 앞을 가로막고 있는 모든 어리석은 자 들에게
나와 그대의 힘을
위대한 파멸의 힘을 보여줄 것을

댓글 달기

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