使用 %s 进行格式化时,# 代表什么

发布于 2024-10-23 00:55:02 字数 202 浏览 1 评论 0原文

我遇到了这个断言示例,并且想知道 # 的用途:

#define ASSERT( x ) if ( !( x ) ) { \
    int *p = NULL; \
    DBGPRINTF("Assert failed: [%s]\r\n Halting.", #x); \
    *p=1; \
  } 

I came across this example of an assertion and was wondering what the # is for:

#define ASSERT( x ) if ( !( x ) ) { \
    int *p = NULL; \
    DBGPRINTF("Assert failed: [%s]\r\n Halting.", #x); \
    *p=1; \
  } 

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

笨死的猪 2024-10-30 00:55:02

它是“字符串化”预处理运算符。

它采用作为参数传递给宏参数 x 的标记,并将它们转换为字符串文字。

#define ASSERT(x) #x

ASSERT(a b c d)
// is replaced by
"a b c d"

It is the "stringize" preprocessing operator.

It takes the tokens passed as the argument to the macro parameter x and turns them into a string literal.

#define ASSERT(x) #x

ASSERT(a b c d)
// is replaced by
"a b c d"
煞人兵器 2024-10-30 00:55:02

#x 是字符串化指令

#define Stringify(x) #x

表示 Stringify(abc) 将被替换为 "abc"

#define initVarWithItsOwnName(x) const char* p = #x

int main()
{
   initVarWithItsOwnName(Var);
   std::cout << Var; //will print Var
}

#x is the stringification directive

#define Stringify(x) #x

means Stringify(abc) will be substituted with "abc"

as in

#define initVarWithItsOwnName(x) const char* p = #x

int main()
{
   initVarWithItsOwnName(Var);
   std::cout << Var; //will print Var
}
呆° 2024-10-30 00:55:02

# 是预处理器的“字符串化”运算符 。它将宏参数转换为字符串文字。如果您调用 ASSERT(foo >= 32),则在宏求值期间,#x 将扩展为 "foo >= 32"

# is the preprocessor's "stringizing" operator. It turns macro parameters into string literals. If you called ASSERT(foo >= 32) the #x is expanded to "foo >= 32" during evaluation of the macro.

日暮斜阳 2024-10-30 00:55:02

这是一个名为字符串化的预处理器功能。它

用实际参数的文字文本替换[宏参数],并转换为字符串常量。

It's a preprocessor feature called stringification. It

replaces [the macro parameter] with the literal text of the actual argument, converted to a string constant.

总攻大人 2024-10-30 00:55:02

# 是第 6.10.3.2 节 (C99) 和第 16.3.2 节中定义的字符串化运算符。 (C++03)

它将宏参数转换为字符串文字,而不扩展参数定义。

如果结果的替换不是有效的字符串文字,则
行为未定义。 # 运算符的求值顺序未指定

例如,从语法上讲,字符串文字中反斜杠字符的出现仅限于转义序列。

在以下示例中:

1        #define  mkstr(x)  #  x
2        char  *p  =  mkstr(a  \  b);  
       /*  "a  \  b"  violates  the  syntax  of  string  literals  */

# 运算符的结果不必是"a \ b"

# is the stringizing operator defined in Section 6.10.3.2 (C99) and in Section 16.3.2. (C++03)

It converts macro parameters to string literals without expanding the parameter definition.

If the replacement that results is not a valid character string literal, the
behavior is undefined. The order of evaluation of # operator is unspecified.

For instance, syntactically, occurrences of the backslash character in string literals are limited to escape sequences.

In the following example:

1        #define  mkstr(x)  #  x
2        char  *p  =  mkstr(a  \  b);  
       /*  "a  \  b"  violates  the  syntax  of  string  literals  */

the result of the # operator need not be "a \ b".

一梦等七年七年为一梦 2024-10-30 00:55:02

您所看到的称为字符串化。它允许您将宏的参数转换为字符串文字。您可以在这里阅读更多相关信息 http://gcc.gnu.org/onlinedocs/cpp/字符串化.html

What you see is called stringification. It allows you to convert an argument of a macro into a string literal. You can read more about it here http://gcc.gnu.org/onlinedocs/cpp/Stringification.html.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文