2016-03-18 89 views
0

我正在實施詳細模式。以下是我試圖做的事:定義一個全局變量VERBOSE(在verbose.h中),這樣需要詳細的文件只需要包含該文件。例如:在C中實現詳細信息

verbose.h:

void setVerbose(int test); 

verbose.c:

#include "verbose.h" 

// define VERBOSE if called 
void setVerbose(int test) { 
    if (test) { 
     #ifndef VERBOSE 
     #define VERBOSE 
     #endif 
    } 
} 

point.h:

typedef struct Point Point; 
struct Point { 
    int x, y; 
}; 

void printPoint(Point *point); 

point.c:

#include "point.h" 
#include "verbose.h" 

void printPoint(Point *point) { 
    #ifdef VERBOSE 
     printf("My abscissa is %d\n", point->x); 
     printf("My ordinate is %d\n", point->y); 
    #endif 

    printf("[x,y] = [%d, %d]\n", point->x, point->y); 
} 

和主:

main.c中:

#include "verbose.h" 
#include "point.h" 

int main(int argc, char *argv[]) { 
    if (argc >= 2 && !strcmp(argv[1], "-v")) 
     setVerbose(1); 

    Point *p = init_point(5,7); 
    printPoint(p); 

    return 0; 
} 

可執行製作得到:

$ gcc -o test main.c point.c verbose.c 

希望的輸出是:

$ ./test 
    [x,y] = [5, 7] 

$ ./test -v 
    My abscissa is 5 
    My ordinate is 7 
    [x,y] = [5, 7] 

問題是,它似乎VERBOSE在調用printPoint()時未在point.c中定義。

+2

請重新讀取的預處理器的概念。 –

+4

'#define'是一個**預處理器**指令。在if語句中放置一個#define是毫無意義的。在編譯程序之前編譯'#define'。 –

+0

其他人已經提到了這個問題,因此我只是建議你使用**日誌類**而不是你目前的方法。它更加靈活。例如,我前段時間爲Arduino寫了一篇https://abrushforeachkeyboard.wordpress.com/2014/06/17/arduino-adding-a-logger-class-with-ac-style-print-of-messages/ –

回答

0

預處理器命令是在編譯時決定的,而不是運行時,所以你的系統將無法工作。我會推薦使用全球bool Verbose並提供verbose()函數來執行打印(或不打印)。

verbose.h

#include <stdbool.h> 

int verbose(const char * restrict, ...); 
void setVerbose(bool); 

verbose.c

#include "verbose.h" 
#include <stdbool.h> 
#include <stdarg.h> 
#include <stdio.h> 

bool Verbose = false; 

void setVerbose(bool setting) { 
    Verbose = setting; 
} 

int verbose(const char * restrict format, ...) { 
    if(!Verbose) 
     return 0; 

    va_list args; 
    va_start(args, format); 
    int ret = vprintf(format, args); 
    va_end(args); 

    return ret; 
} 

的main.c

#include "verbose.h" 
#include <stdbool.h> 

int main() { 
    verbose("Verbose is off\n"); 

    setVerbose(true); 

    verbose("Verbose is on\n"); 

    int foo = 42; 

    verbose("Number: %d\n", foo); 

    return 0; 
} 
+1

*預編譯器的命令是在編譯時決定的 - 這是不正確的,預處理器在編譯器之前插入 –

+0

@EdHeal你在技術上是正確的!...它並沒有改變答案,重要的是它不會在運行時發生。不知道如何解釋預處理器與編譯與運行時間,而不必將複雜的答案複雜化,也許你可以在你自己的答案或編輯? – Schwern

+1

我會考慮簡單地爲海報解釋這一點 –