2012-09-20 44 views
1

我已經我可以在C中打印#defines的值嗎?

#define ADD 5 
#define SUB 6 

我可以打印添加和SUB給他們的價值觀5,6?

+0

你的意思是你想要在你的程序中輸出名稱和值? – CharlesB

+3

你能澄清一下這個問題嗎? –

+0

我有5和6 ..可以打印「ADD」和「SUB」嗎? –

回答

4

define d符號的名稱號由預處理去除,所以編譯器永遠看不到它們。

如果這些名稱在運行時很重要,那麼它們需要用比預處理器符號名稱更持久的東西進行編碼。也許是與字符串和整數表:

#define DEFINE_OP(n) { #n, n } 

static const struct { 
    const char *name; 
    int  value; 
} operators[] = { 
    DEFINE_OP(ADD), 
    DEFINE_OP(SUB), 
}; 

這將使用字符串化預處理程序操作#,以避免重複。

通過上述,您可以平凡寫查找代碼:

const char * op_to_name(int op) 
{ 
    size_t i; 

    for(i = 0; i < sizeof operators/sizeof *operators; ++i) 
    if(operators[i].value == op) 
     return operators[i].name; 
    return NULL; 
} 
1

,你可以這樣做

printf("%d", ADD); 

,它將打印5

你要的東西記住關於定義是:
定義在編譯之前由預處理器替換爲源代碼,以便在代碼中添加所有實例通過5代預處理中的printf看起來像在此之後:

printf("%d", 5); 

因此,要回答你的問題:
不,你不能那樣做。

0

是的,但不是通過某種反向查找機制,其中值5在某種程度上是字符串"ADD"的象徵。通過#define定義的符號被預處理器替換。然而,你可以把它簡單:

const char *get_name(int value) { 
    switch(value) { 
    case ADD: 
     return "ADD"; 
    case SUB: 
     return "SUB"; 
    default: 
     return "WHATEVER"; 
    } 
} 

#include <stdio.h> 

int main() { 
    printf("%s = %d\n", get_name(ADD), ADD); 
    printf("%s = %d", get_name(SUB), SUB); 
} 
+1

請在我有時間回覆之前刪除您的評論。 – Minion91

+1

@ Minion91:爲什麼不呢?我明顯地重新思考了我所說的並決定將其刪除?沒有什麼可以迴應的。我沒有改變主意,只是沒有理由提出來。說這不能做到只是愚蠢的。它可以輕而易舉地完成。 –

+0

因爲我不喜歡它,當人們沒有理由地投我票時。 – Minion91

0

隨着現代C,因爲C99,這是比開卷的回答就更簡單了很多使用指定的初始化和複合文字

#define DEFINE_OP(n) [n] = #n 

#define OPNAMES ((char const*const opNames[]){ \ 
    DEFINE_OPT(ADD),        \ 
    DEFINE_OPT(SUB),        \ 
    }) 

inline 
char const* getOp(unsigned op) { 
    size_t const maxOp = sizeof OPNAMES/ sizeof *OPNAMES; 
    if (op >= maxOp || !OPNAMES[op]) return "<unknown operator>"; 
    else return OPNAMES[op]; 
} 

任何現代編譯器應該能夠再在編譯時將呼叫擴展爲getOp(ADD)

相關問題