在 C 中,如果我有
#define NUMBER_TWO 2
char* string = "NUMBER_TWO";
我怎樣才能從string值 2 得到?
uj5u.com熱心網友回復:
也許 OP 有趣的是一些宏代碼濫用?
用于#macro_parameter形成字串 "macro_argument"。
#include <stdio.h>
#define NUMBER_TWO 2
#define NUMBER_THREE 3
#define NUMBER_FOUR 4
#define TEST_AND_RETURN(s, m) \
do { if (strcmp((s), #m) == 0) return (m); } while (0)
int string_to_value(const char *s) {
TEST_AND_RETURN(s, NUMBER_TWO); // Only 1 coding of NUMBER_TWO
TEST_AND_RETURN(s, NUMBER_THREE);
// Maybe the clear way instead, or are 2 NUMBER_FOUR a concern?
if (strcmp(s, "NUMBER_FOUR") == 0) return NUMBER_FOUR;
return -1;
}
int main() {
char* string = "NUMBER_TWO";
printf("%d\n", string_to_value(string));
printf("%d\n", string_to_value("NUMBER_THREE"));
printf("%d\n", string_to_value("NUMBER_FOUR"));
}
輸出
2
3
4
uj5u.com熱心網友回復:
#define NUMBER_TWO 2甚至在運行時都不存在。
理論上,編譯器本身甚至不知道它已由標記器處理。
這意味著您需要自己創建某種查找。
if ( strcmp( string, "NUMBER_TWO" ) == 0 ) {
... NUMBER_TWO ...
} else {
... ??? ...
}
當然,如果您必須查找很多,應該使用比一系列strcmp呼叫更好的方法。
uj5u.com熱心網友回復:
#define NUMBER_TWO 2是前處理器的一部分。NUMBER_TWO在源代碼中替換為2,然后編譯。NUMBER_TWO運行時不存在任何痕跡。
你必須寫一些東西,它接受一個字串并回傳特定的宏。解決這個問題的最佳方式取決于您對該值的處理方式。如果您有很多希望通過字串訪問的宏,一種簡單的方法是將它們放入哈希中。
#define NUMBER_TWO 2
char* string = "NUMBER_TWO";
// This is just an example. You'll have to write a hash,
// or better use a library such as GLib.
IntHash *stuff = int_hash_new();
int_hash_insert(stuff, "NUMBER_TWO", NUMBER_TWO);
int num = int_hash_fetch(stuff, string);
但是此時你可以跳過宏,直接初始化散列。
char* string = "NUMBER_TWO";
IntHash *stuff = hash_new();
int_hash_insert(stuff, "NUMBER_TWO", 2);
int_hash_insert(stuff, "NUMBER_THREE", 3);
int_hash_insert(stuff, "NUMBER_FOUR", 4);
int num = int_hash_fetch(stuff, string);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/443797.html
上一篇:查找字串中的第一個字母
下一篇:查找字串中一行的最后一個字符
