1
A
回答
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);
}
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)
。
相關問題
- 1. 我可以在for循環中打印每個值嗎?
- 2. 可以在Grails 1.3.7中打印JSON嗎?
- 3. 我可以在Linux中編輯GCC的打印輸出嗎?
- 4. 我們可以使用for循環在C中打印帶'*'的'A'嗎?
- 5. 我可以在Xcode的消息/警告中打印出預處理器值嗎?
- 6. 我可以使用PHP和Apache打印到我的打印機嗎?
- 7. 我可以在Adobe Air中打印HTMLLoader(pdf)嗎?
- 8. 我可以在JUnit測試中打印信息消息嗎?
- 9. 我們可以在Python中使用return來打印函數嗎?
- 10. 我可以強制在HTML打印中跳轉頁面嗎?
- 11. 我可以在Silverlight中打印內容嗎
- 12. 打印C#TimeSpan值以JavaScript
- 13. 這可以打印在同一行嗎?
- 14. 我可以有兩個組頭文件嗎?我可以替代打印嗎?
- 15. typedef int - >整數。我可以做cout->在C++中打印嗎?
- 16. 我們可以通過在C中使用裸地址來打印數據嗎?
- 17. 我可以在收據打印機上打印自定義收據嗎?
- 18. 我可以漂亮地打印DBIx :: Class中的DBIC_TRACE輸出嗎?
- 19. 可以像在C中一樣使用C++打印字符的ASCII碼嗎?
- 20. 我可以打印可用的customzie行
- 21. 我可以從我的打印css中刪除URL嗎,所以網址不打印?
- 22. 我們可以從Web視圖中打印嗎?
- 23. 我可以在畫布上打印圖像嗎?
- 24. Ansible - 我可以在模塊執行期間打印信息嗎?
- 25. 我可以在打印機上使用FIleOutputStream打印
- 26. gdb可以打印64位地址嗎?
- 27. 可以putchar打印一個整數嗎?
- 28. FullCalendar可以打印到PDF嗎?
- 29. Python可以打印函數定義嗎?
- 30. 我們可以在pytest中的setup_module()或setup_class中打印命令行參數嗎?
你的意思是你想要在你的程序中輸出名稱和值? – CharlesB
你能澄清一下這個問題嗎? –
我有5和6 ..可以打印「ADD」和「SUB」嗎? –