[완료]C에서 특정 함수만 재정의하고 싶습니다.

halfsmart의 이미지

다음 처럼 a 라는 함수에서 b를 호출하고 있을때,
a.c 파일에 수정을 가하지 않고,
b 함수를 재정의하고 싶습니다.

c++ 처럼 상속과 재정의를 하면 좋겠는데,
우선 원본 파일이 c로 작성되어 있고, 수정을 하면 안 됩니다.

/** a.c **/
a()
{
  b();
}

좋은 방법이 없을까요?
결국 제가 하고 있는 방법은 파일을 새로 만들어 a()함수를 복사한 다음
b() 함수대신 다른 함수를 호출하도록 하고 있습니다.

문제는 제가 재정의하고 싶은 함수가 call depth가 깊으면 그 함수를 호출하는 함수들까지 다시 copy & paste를 해야하는건지..

조언부탁드립니다.

jos77의 이미지

.a 로 라이브러리로 제공되는 것도 아니고, 소스를 수정할 수가 없다는 게 이상하군요
그냥 copy & paste 하면 안되는 이유가 있나요? call depth 따지기 전에 만들고자 하는 함수를 설계부터 잘하시는게 중요할듯

-----
안녕하세요 소프트웨어 공학센터 장원석 책임입니다.
http://www.software.kr

keke111의 이미지

define문으로 함수명을 변경하면 되는것 같은데요.

halfsmart의 이미지

현재 제가 작업중인 게 두가지 module로 나누어져 있습니다.

A module은 제가 지금 수정을 하고 있구요.

B module은 제공받는 것으로 소스는 있지만, library로 만들어서 사용하고 있습니다.
B module은 version이 여러 개 있어서 직접 소스를 수정하면 매번 B module이 바뀔 때마다 수정을 해야해요.

B module에 파일을 추가하거나 하는건 괜찮은데, 직접 기존 소스를 수정하고 싶지 않습니다.

#define으로 바꾸는 것도 결국 소스를 건드리는 건데..
조언 감사드립니다.

whitelazy의 이미지

음.. 엽기적이려나.. 함수명을 동일하게 유지하고싶어서 그러시는거면.. 함수 포인터 정의하고 함수 포인터를 바꿔가면서 쓰시는방법은 어떠련지 =333

phonon의 이미지

예로,
통신회사의 기지국 서버 프로그램에 버그가 발생했을 경우에 운영 중인 서버를 중단하는 것은 회사에 입장에서 수익이나 신뢰가 떨어지는 일이므로, 라이브 패치로 해당 함수의 주소를 새로운 함수의 주소를 변경해서 서비스 운영의 장해 발생을 최소로 합니다.

보통 상당한 고가의 소프트웨어가 있습니다.
그렇다고 모든 경우에 가능한 것도 아닙니다.

아래와 같이, 제품의 메뉴얼을 보면 제약조건이 나열되어 있더군요.
1.헤더화일의 인라인 금지
2.함수 주소크기
3.전역변수 사용의 주의점 등등
왜 사용하는지 의구심이 생길 정도로 되는 것보다 안 된다는 내용이 더 많습니다.

halfsmart님의 프로젝트 특성에 의해서 라이브 패치가 필요한지 아니면, 설계의 변경으로도 대응이 되는지를 먼저 고려해 보시기 바랍니다.

halfsmart의 이미지

phonon 님이 말씀하신 라이브패치는 아니지만
제가 원하는 게 비슷한 내용인거 같습니다.

다른 방법으로 해결 할 수 있는지 생각해 보겠습니다.
감사합니다.

댓글 달기

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