[완료] 함수 포인터를 사용한 함수이름 공유.

yundorri의 이미지

안녕하세요, 항상 이자리에서 많은 분들의 도움을 받음에 감사드립니다.

다름이 아니라, 같은 기능을 하는 이름이 다른 두 함수를 동일하게 공유를 할 수 있을까요?
이를테면,

void This_is_Sample_Function( int arg, ... )
{
        ...
        Blah Blah ~
        ...
}
 
void This_is_Example_Function( int arg, ... )
{
        ...
        Blah Blah ~
        ...
}

위 두 함수는 동일한 내용과 동일한 반환값, 동일한 인자를 가지고 있습니다.
물론, This_is_Sample_Function()에서 This_is_Example_Function()을 호출해도 되겠지만
가변인자를 가지고 있으면 그것도 자유롭지 못합니다.
저의 경우 Blah Blah~ 가 꽤 긴데요, 저런게 한 서너게 있으니 그것만 몇 백 라인이
되버려 하나의 내용이 바뀌면 모두 찾아서 바꿔줘야하는 불편함이 이만저만이 아닙니다.
서로다른 함수 두개 (인자, 타입, 반환값은 같고 이름만 다른)를 동일한 것으로 만들 수 있을까요???

도움 부탁드립니다.

ps) 제목도 뭐라고 해야될지 몰라서 써 놓긴했는데 적절하지 않은것 같아 쫌 그렇네요~ ^^

geneven의 이미지

함수 포인터를 이용하면 되지 않나요?

auditory의 이미지

function pointer를 쓰면 어떨까요?

void This_is_Sample_Function( int arg, ... )
{
...
Blah Blah ~
...
}

void (*This_is_Example_Function)( int arg, ... ) = This_is_Sample_Function;

익명 사용자의 이미지

void (* This_is_Example_Function)(int arg, ... ) = &This_is_Sample_Function

???

const 를 적당히 붙힐수도 있을 것 같은데...

yundorri의 이미지

오오~ 그런 방법이~
당장 해 봐야겠군요. ^o^

해 보고 잘 되면 답글 달겠습니다.

익명 사용자의 이미지

#define This_is_Example_Function This_is_Sample_Function

하면 되지 않나요?

yundorri의 이미지

좋은 방법이긴 합니다만,

그렇게 하면 함수를 두 번 정의했다고 컴파일시에 오류가 날것 같습니다.

yundorri의 이미지

잘 됩니다. 좋은 것 배우고 갑니다.

geneven님, auditory님, 이름을 남기지 않으신 분 감사드립니다.

제목 바꿨습니다. 그리고 혹, 내공이 필요하신분을 위해서...

#include <stdio.h>
 
int functionA( int var, ... )
{
    int data;
    va_list ap;
    va_start( ap, var );
 
    printf( "Parameter = " );
    printf( "%d, ", var );
    while( 1 )
    {
        data = va_arg( ap, int );
        if( data == 0 ) break;
        printf( "%d, ", data );
    }
    va_end( ap );
    printf( "\n" );
 
    return 9;
}
 
int (* functionB)(int arg, ... ) = &functionA;
int (* functionC)(int arg, ... ) = &functionA;
 
int main()
{
    int retA = functionA( 1, 2, 0 );
    int retB = functionB( 1, 2, 3, 0 );
    int retC = functionC( 1, 2, 3, 4, 0 );
    printf( "retA= %d, retB= %d, retC= %d\n", retA, retB, retC );
    return 0;
}

yundorri의 이미지

함수포인터의 선언은 어떻게????

위 예제를 가지고 몇개의 파일로 나누어보았습니다.

main.c

#include <stdio.h>
#include "util.h"
 
int main()
{
    int retA = functionA( 1, 2, 0 );
    int retB = functionB( 1, 2, 3, 0 );
    int retC = functionC( 0, 2, 3, 4, 0 );
    printf( "retA= %d, retB= %d, retC= %d\n", retA, retB, retC );
    return 0;
}

util.c
#include <stdio.h>
#include <stdarg.h>
 
#include "util.h"
 
int functionA( int var, ... )
{
    int data;
    va_list ap;
    va_start( ap, var );
 
    printf( "Parameter = " );
    printf( "%d, ", var );
    while( 1 )
    {
        data = va_arg( ap, int );
        if( data == 0 ) break;
        printf( "%d, ", data );
    }   
    va_end( ap );
    printf( "\n" );
 
    return 9;
}
 
int (* functionB)(int var, ... ) = &functionA;
int (* functionC)(int var, ... ) = &functionA;

util.h
#ifndef UTIL_H
#define UTIL_H
#include <stdio.h>
#include <stdarg.h>
 
int functionA( int var, ... );
int (* functionB)( int var, ... );
int (* functionC)( int var, ... );
 
#endif

Makefile
all: main
 
util.o: util.c util.h
    g++ -I. -c util.c -o util.o
 
main: main.c util.o util.h
    g++ -I. -o main main.c util.o
 
clean:
    rm *.o main -f

위와 같이 되어있을 경우 컴파일 시 다음과 같은 에러가 발생합니다.

[yundorri@dev temp]$ make
g++ -I. -c util.c -o util.o
util.c:26: error: redefinition of 'int (* functionB)(int, ...)'
util.h:7: error: 'int (* functionB)(int, ...)' previously declared here
util.c:27: error: redefinition of 'int (* functionC)(int, ...)'
util.h:8: error: 'int (* functionC)(int, ...)' previously declared here
make: *** [util.o] 오류 1
[yundorri@dev temp]$ 

요점은 '함수포인터의 선언은 어떻게 하는지'와 관련된 것 같습니다.
완료됐다고 생각했는데 이런문제에 부딪쳤습니다.
아아~ 고수의 길은 멀고도 험하군요. (남을 가르킬 수 있는 고수까지는 아니더라도
자신의 문제는 스스로 해결할 수 있어야 할 텐데 말입니다.)

부탁드립니다.

익명 사용자의 이미지

함수포인터를 "선언"해야 하는데 "정의"하셨군요. 함수 포인터 변수도 다른 포인터 변수와 똑같은 변수입니다.

헤더 파일에서 int x; 해놓고 C 파일에서 int x = 3; 이렇게 써준 것과 똑같은 상황입니다. functionB, functionC라는 변수가 두 번씩 정의되었으니 에러가 나지요.

헤더에서는 extern을 붙여주세요.

chadr의 이미지

main.c

Quote:
#include
#include "util.h"

extern functionPointer functionB;
extern functionPointer functionC;

int main()
{
int retA = functionA( 1, 2, 0 );
int retB = functionB( 1, 2, 3, 0 );
int retC = functionC( 0, 2, 3, 4, 0 );
printf( "retA= %d, retB= %d, retC= %d\n", retA, retB, retC );
return 0;
}

util.h

Quote:
#ifndef UTIL_H
#define UTIL_H
#include
#include

int functionA( int var, ... );

typedef int (* functionPointer)( int var, ... );

#endif

util.c

Quote:
#include
#include

#include "util.h"

functionPointer functionB = functionA;
functionPointer functionC = functionA;

int functionA( int var, ... )
{
int data;
va_list ap;
va_start( ap, var );

printf( "Parameter = " );
printf( "%d, ", var );
while( 1 )
{
data = va_arg( ap, int );
if( data == 0 ) break;
printf( "%d, ", data );
}
va_end( ap );
printf( "\n" );

return 9;
}

이렇게 해보세요..

-----

라고 써놓고 보니 다른분께서 이미 답을 달아주셨군요 ㅎㅎ

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

yundorri의 이미지

아, 저도 글써놓고 함수포인터로 검색해서 보다보니까
함수포인터도 변수의 하나라는 것을 알게되었습니다.

감사합니다. 문제도 해결된 듯 합니다.

panda005의 이미지

#define functionB functionA
#define functionC functionA
입니다요

댓글 달기

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