C++ 宏:操作参数(具体示例)

发布于 2024-07-17 14:23:41 字数 177 浏览 2 评论 0原文

我需要替换

GET("any_name")

String str_any_name = getFunction("any_name");

困难的部分是如何修剪掉引号。 可能的? 有任何想法吗?

I need to replace

GET("any_name")

with

String str_any_name = getFunction("any_name");

The hard part is how to trim off the quote marks. Possible? Any ideas?

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

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

发布评论

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

评论(3

┾廆蒐ゝ 2024-07-24 14:23:41

怎么样:

#define UNSAFE_GET(X) String str_##X = getFunction(#X);

或者,防止嵌套宏问题:

#define STRINGIFY2(x) #x
#define STRINGIFY(x) STRINGIFY2(x)
#define PASTE2(a, b) a##b
#define PASTE(a, b) PASTE2(a, b)

#define SAFE_GET(X) String PASTE(str_, X) = getFunction(STRINGIFY(X));

用法:

SAFE_GET(foo)

这就是编译的内容:

String str_foo = getFunction("foo");

要点:

  • 使用 ## 将宏参数组合成单个标记(标记 => 变量名等)
  • 并使用 # 进行字符串化宏参数(在 C/C++ 中进行“反射”时非常有用)
  • 为宏使用前缀,因为它们都在同一个“命名空间”中,并且您不希望与任何其他代码发生冲突。 (我根据您的用户名选择了 MLV)
  • 如果您嵌套宏,即从另一个具有其他合并/字符串化参数的宏调用 MLV_GET,则包装器宏会有所帮助(根据下面的评论,谢谢!)。

How about:

#define UNSAFE_GET(X) String str_##X = getFunction(#X);

Or, to safe guard against nested macro issues:

#define STRINGIFY2(x) #x
#define STRINGIFY(x) STRINGIFY2(x)
#define PASTE2(a, b) a##b
#define PASTE(a, b) PASTE2(a, b)

#define SAFE_GET(X) String PASTE(str_, X) = getFunction(STRINGIFY(X));

Usage:

SAFE_GET(foo)

And this is what is compiled:

String str_foo = getFunction("foo");

Key points:

  • Use ## to combine macro parameters into a single token (token => variable name, etc)
  • And # to stringify a macro parameter (very useful when doing "reflection" in C/C++)
  • Use a prefix for your macros, since they are all in the same "namespace" and you don't want collisions with any other code. (I chose MLV based on your user name)
  • The wrapper macros help if you nest macros, i.e. call MLV_GET from another macro with other merged/stringized parameters (as per the comment below, thanks!).
×纯※雪 2024-07-24 14:23:41

在回答你的问题时,不,你不能“去掉”C++ 中的引号。 但正如其他答案所表明的那样,您可以“添加它们”。 由于无论如何您都将始终使用字符串文字(对吗?),因此您应该能够切换到新方法。

In answer to your question, no, you can't "strip off" the quotes in C++. But as other answers demonstrate, you can "add them on." Since you will always be working with a string literal anyway (right?), you should be able to switch to the new method.

神也荒唐 2024-07-24 14:23:41

一种方法是在调用宏时不引用名称:

#include <stdio.h>

#define GET( name ) \
    int int##name = getFunction( #name );   \


int getFunction( char * name ) {
    printf( "name is %s\n", name );
    return 42;
}

int main() {
    GET( foobar );
}

One approach is not to quote the name when you call the macro:

#include <stdio.h>

#define GET( name ) \
    int int##name = getFunction( #name );   \


int getFunction( char * name ) {
    printf( "name is %s\n", name );
    return 42;
}

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