#ifdef ~ #endif 에 대한 궁금한 점...

달파란의 이미지

제가 수정하기로 하고 넘겨 받은 소스 중에 아래와 같은 부분이 있습니다.

#define AUTH

[..중략.]

#ifdef AUTH
    func_A();
    func_AA();
#else
    func_B();
    func_BB();
#endif

제가 의아하게 생각하는 점은 #ifdef ~ #endif 구문은
Makefile 등에서 flag 를 define 하여 유연하게 사용하기 위한 것으로 알고 있는데,
위와 같이 맨 위에 #define AUTH 로 hard coding 되어있으면
소스를 직접 건드리지 않은 한 항상 func_A(); func_AA(); 만 실행되지 않느냐는 점입니다.

제가 func_B(); func_BB(); 가 실행되게 하고 싶으면 Makefile 수준에서 제어할수 없고.. 소스를 열어서 #define AUTH 를 주석처리하는 수 밖에 없는 것일까요??

IsExist의 이미지

컴파일시 지정하는 옵션이 더 우선일겁니다.

-UAUTH 로 지정해 보세요.

---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

dreamer의 이미지

현재의 코드상에서는 주석처리를 해야죠..
주석 처리를 한후에

-DAUTH 

를 Makefile에서 지정해주면 Makefile에서 지정 할 수 있죠..
달파란의 이미지

그렇군요. 소스를 건드리지 않고 -UAUTH 를 옵션으로 주는 방법은 통하지 않네요..

# cat deftest.c
#define AUTH

int main()
{
        #ifdef AUTH
                printf("HAHAHA\n");
        #else
                printf("HOHOHO\n");
        #endif

        return 0;
}


# gcc deftest.c -UAUTH
# ./a.out
HAHAHA

결국 #ifdef ~ #endif 구문을 쓸때 #define AUTH 와 같이 하드코딩해 놓는 것은 좋은 습관이 아닌것 같네요.
cdpark의 이미지

#ifndef DISABLE_AUTH
#define AUTH
#endif

[..중략.]

#ifdef AUTH
    func_A();
    func_AA();
#else
    func_B();
    func_BB();
#endif

식으로 한 번 더 싸주면 됩니다.

그냥 컴파일하면 func_A가, 컴파일 시에 -DDISABLE_AUTH 라고 해 주면 func_B가 컴파일됩니다.

krisna의 이미지

달파란 wrote:

결국 #ifdef ~ #endif 구문을 쓸때 #define AUTH 와 같이 하드코딩해 놓는 것은 좋은 습관이 아닌것 같네요.

제 생각에는 프로그램 저자가 대강 빨리 하려고 파일에 직접 define을 한 것 같습니다.
좋지 않은 방식이죠.

k2hyun의 이미지

제 생각에는 원작자가 이것저것 테스트하면서 만들어 놓고 가장 최근 테스트(또는 완성) 한 버전을 드린 것 같습니다. ^^

#define AAAAAA 1

이렇게 해놓고
저~~ 밑에가서

if( AAAAAA ) {
} else {
}

이런 코드들도 꽤 있지요.. 8)

더 이상 없다.

댓글 달기

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