如何从 C 宏的值生成 char 字符串?
例如,如何避免将“func_name”写入两次?
#ifndef TEST_FUN
# define TEST_FUN func_name
# define TEST_FUN_NAME "func_name"
#endif
我想遵循单点事实规则。
C 预处理器版本:
cpp --version
输出:
cpp (GCC) 4.1.2 20070626 (Red Hat 4.1.2-14)
For example, how can I avoid writing the 'func_name' twice?
#ifndef TEST_FUN
# define TEST_FUN func_name
# define TEST_FUN_NAME "func_name"
#endif
I'd like to follow the Single Point of Truth rule.
Version of C preprocessor:
cpp --version
Output:
cpp (GCC) 4.1.2 20070626 (Red Hat 4.1.2-14)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
害羞的人*给了你答案,但只是胚芽。 在 C 预处理器中将值转换为字符串的基本技术确实是通过“#”运算符,但是对所提出的解决方案进行简单音译会出现编译错误:
语法错误位于“puts()”行- 问题是源中的“杂散#”。
在 C 标准第 6.10.3.2 节“# 运算符”中,它说:
问题在于您可以将宏参数转换为字符串,但无法转换不是宏参数的随机项。
所以,为了达到你想要的效果,你肯定需要做一些额外的工作。
我不完全清楚您计划如何使用宏,以及您计划如何完全避免重复。 这个稍微复杂一点的例子可能会提供更多信息。 使用与 STR_VALUE 等效的宏是获得所需结果所必需的习惯用法。
* 在第一次编写此答案时,shoosh 的名字使用“Shy”作为名字。
He who is Shy* gave you the germ of an answer, but only the germ. The basic technique for converting a value into a string in the C pre-processor is indeed via the '#' operator, but a simple transliteration of the proposed solution gets a compilation error:
The syntax error is on the 'puts()' line - the problem is a 'stray #' in the source.
In section 6.10.3.2 of the C standard, 'The # operator', it says:
The trouble is that you can convert macro arguments to strings -- but you can't convert random items that are not macro arguments.
So, to achieve the effect you are after, you most certainly have to do some extra work.
I'm not completely clear on how you plan to use the macros, and how you plan to avoid repetition altogether. This slightly more elaborate example might be more informative. The use of a macro equivalent to STR_VALUE is an idiom that is necessary to get the desired result.
* At the time when this answer was first written, shoosh's name used 'Shy' as part of the name.
Jonathan Leffler 的解决方案 作品。
一个完整的工作示例:
示例:
输出:
Jonathan Leffler's solution works.
A complete working example:
Example:
Output:
参考:维基百科的 C 预处理器页面
Reference: Wikipedia's C preprocessor page