使用 #define 作为标识符(函数名称)和字符串的预处理器语法

发布于 2024-08-23 08:11:32 字数 577 浏览 2 评论 0原文

我不确定这是否可行,但我想创建一个共享对象文件,并且希望通过可用于取消引用该函数的 #define 来使其易于使用名称。

libfoo.h

#define FOO_SO_FUNCTION_A    aFunction

libfoo.so

#include "libfoo/libfoo.h"

extern "C" int FOO_SO_FUNCTION_A( void )
{
    ...
}

clientfoo

#include "libfoo/libfoo.h"

...
libfoofunc = dlsym( libfoo, MAKE_STRING(FOO_SO_FUNCTION_A) );

我的问题是,

#FOO_SO_FUNCTION_A

将简单地更改为“FOO_SO_FUNCTION_A”,因为预处理器只运行一次。还有其他方法可以实现此目的吗?

I'm not sure if this is possible, but I would like to create a shared object file and I would like to make it easy to use by having a #define that can be used to dereference the function names.

In libfoo.h

#define FOO_SO_FUNCTION_A    aFunction

In libfoo.so

#include "libfoo/libfoo.h"

extern "C" int FOO_SO_FUNCTION_A( void )
{
    ...
}

In clientfoo

#include "libfoo/libfoo.h"

...
libfoofunc = dlsym( libfoo, MAKE_STRING(FOO_SO_FUNCTION_A) );

My problem is that

#FOO_SO_FUNCTION_A

Will simply change into "FOO_SO_FUNCTION_A" because the preprocessor rightfully only runs once. Is there another way to accomplish this?

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

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

发布评论

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

评论(1

香草可樂 2024-08-30 08:11:32

使用这个:

#define REALLY_MAKE_STRING(x) #x
#define MAKE_STRING(x) REALLY_MAKE_STRING(x)

由于预处理器替换宏时规则的一些细节,需要额外的间接级别。

Use this:

#define REALLY_MAKE_STRING(x) #x
#define MAKE_STRING(x) REALLY_MAKE_STRING(x)

Due to some details of the rules when exactly the preprocessors substitutes macros, an extra level of indirection is required.

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