- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
请通过。
#define _VERSION_ 1.4
#define DEFAULT_NETWORK_TOKEN_KEY { 3, 6, 5, 100}
//我不能改变上面的宏但是下面
#define STR_VALUE(arg) #arg
#define FUNCTION_NAME(name) STR_VALUE(name\r)
#define TEST_FUNC #AP started v _VERSION_
#define TEST_FUNC_NAME FUNCTION_NAME(TEST_FUNC)
#define QUOTE_X(t)#t
#define QUOTE(t)QUOTE_X(t)
#define ABC 100 //{ 3, 6, 5, 100}
#define MYSTR "The value of ABC is"
const uint8 startMsg[] = MYSTR " " QUOTE(ABC);
结果:ABC的值为100
const uint8 startMsg[] = TEST_FUNC_NAME;
results: #AP started v 1.4(回车)//我也想去掉v和1.4之间的空格
我要
const uint8 startMsg[] = ?? ;
结果应该是#AP started [3.6.5.100] v1.4(回车)或#AP started [3,6,5,100] v1.4(回车返回)或类似的。
我正在开发 SOC 芯片,需要在启动时展示它。紧迫的。:)
------ 问题的答案是------
#define NETTOKENKEY(a,b,c,d) "[" #a "." #b "." #c "." #d "]"
#define GENNETTOKENKEY(z) NETTOKENKEY(z)
#define STRINGIZER(arg) #arg
#define STR_VALUE(arg) STRINGIZER(arg)
#define AP_VERSION_STR "#AP started v" STR_VALUE(_VERSION_)
#define AP_NETVERSION_STR "#AP started " \
GENNETTOKENKEY(DEFAULT_NETWORK_TOKEN_KEY_VALUES) \
" v" STR_VALUE(_VERSION_) **"\r"**
const uint8 startMsg[] = AP_NETVERSION_STR ;
最佳答案
C 预处理器是一个相当简单的文本替换程序,我不认为它能够执行您需要的操作并生成编译时常量字符串如果它是绝对不可能更改 DEFAULT_NETWORK_TOKEN_KEY
宏。
转换“数组”表示法特别困难——事实上,不更改数组定义宏的前提可能意味着这是不可能的。
如果可以定义新的宏并重新定义 DEFAULT_NETWORK_TOKEN_KEY
以使其产生与以往相同的值,那么您可以获得所需的结果。
为了说明,请注意您可以这样写:
#define x { 3, 45, 5, 49}
#define f4(a,b,c,d) #a " - " #b ":" #c "/" #d
#define y(z) f4(z)
y(x)
经过预处理后,会产生:
"{ 3" " - " "45" ":" "5" "/" "49}"
请注意,大括号是参数字符串的一部分。现在,如果你能做到:
#define DEFAULT_NETWORK_TOKEN_KEY_VALUES 3, 6, 5, 100
#define DEFAULT_NETWORK_TOKEN_KEY { DEFAULT_NETWORK_TOKEN_KEY_VALUES}
(我保留了你的不对称间距,虽然我认为这不是真的有必要),然后你可以使用:
#define NETTOKENKEY(a,b,c,d) "[" #a "." #b "." #c "." #d "]"
#define GENNETTOKENKEY(z) NETTOKENKEY(z)
GENNETTOKENKEY(DEFAULT_NETWORK_TOKEN_KEY_VALUES)
获取字符串“[3.6.5.100]”(对于我示例中的值)。
去掉 v
和 1.4
之间的空格相对容易:
#define STRINGIZER(arg) #arg
#define STR_VALUE(arg) STRINGIZER(arg)
#define AP_VERSION_STR "#AP started v" STR_VALUE(_VERSION_)
AP_VERSION_STR
将这些拼凑在一起产生:
#define AP_NETVERSION_STR "#AP started " \
GENNETTOKENKEY(DEFAULT_NETWORK_TOKEN_KEY_VALUES) \
" v" STR_VALUE(_VERSION_)
static const char version[] = AP_NETVERSION_STR;
如果您想要在末尾添加 '\r'
,请将 "\r"
添加到 AP_NETVERSION_STR 宏定义的末尾。字符串连接非常有用!
但是,这是基于能够“更改”DEFAULT_NETWORK_TOKEN_KEY
的定义,以便它可以像这样格式化。如果没有这种改变,我认为你做不到。
测试是必要的!
#define _VERSION_ 1.4
#define DEFAULT_NETWORK_TOKEN_KEY_VALUES 3, 6, 5, 100
#define DEFAULT_NETWORK_TOKEN_KEY { DEFAULT_NETWORK_TOKEN_KEY_VALUES}
#define NETTOKENKEY(a,b,c,d) "[" #a "." #b "." #c "." #d "]"
#define GENNETTOKENKEY(z) NETTOKENKEY(z)
GENNETTOKENKEY(DEFAULT_NETWORK_TOKEN_KEY_VALUES)
#define STRINGIZER(arg) #arg
#define STR_VALUE(arg) STRINGIZER(arg)
#define AP_VERSION_STR "#AP started v" STR_VALUE(_VERSION_)
AP_VERSION_STR
#define AP_NETVERSION_STR "#AP started " \
GENNETTOKENKEY(DEFAULT_NETWORK_TOKEN_KEY_VALUES) \
" v" STR_VALUE(_VERSION_)
AP_NETVERSION_STR
当通过 gcc -E
运行时,经过温和净化的输出(删除了空行和 #line
控件)是我们所需要的:
"[" "3" "." "6" "." "5" "." "100" "]"
"#AP started v" "1.4"
"#AP started " "[" "3" "." "6" "." "5" "." "100" "]" " v" "1.4"
关于c - 如何将具有数组的宏字符串化为#define a_macro {5,7,7,97}?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11689825/
我是一名优秀的程序员,十分优秀!