C预处理器:有没有办法在自身内部扩展宏的名称

时间:2016-02-06 07:58:37

标签: c c-preprocessor

我想要一个宏来打印它自己的名字(除其他外),但我找不到扩展宏的方法'宏本身中的名称。基本上,我希望宏名称相当于__FUNCTION__

例如:

#define F(a, b, c) do { \
   printf("%s: %s,%s,%s\n", __MACRO__, #a, #b, #c); \
   c = a+b; b=a; \
} while(0)

F(x,y,z); 

我希望这打印" F:x,y,z"什么时候叫。

这确实是一个XY问题。

这就是我想要做的事情:使用dlopen和dlsyms从库中软链接符号。

为了做到这一点,我所知道的典型方式是: 1)包括库中的标题。 2)声明您要导入的函数类型的变量 3)通过调用dlsym初始化所述变量 4)通过该变量调用实际函数,而不是直接调用符号。

当你对软链接有很多这样的功能时,它变得非常重复,所以宏可以提供帮助。

有关完整的例子,请参阅此处:https://github.com/WebKit/webkit/blob/master/Source/WebCore/platform/mac/SoftLinking.h

该示例和其他示例中的问题是您仍需要手动复制要用于软链接的每个功能的参数列表。 我试图改进这一点,并且正在试验宏观技巧,其中一个可以通过回答我的初步问题得到帮助。

-

除了我的软链接问题,还有其他可能有用的情况。例如,出于调试目的,可能希望在每次调用某些功能之前或之后打印一些诊断信息。可以通过用宏覆盖函数名来实现:

#define funcA(...) \
printf("Before call to %s:%d - %d\n", #funcA, __LINE__, g_count); \
funcA(__VA_ARGS__) \
printf("After call to %s:%d - %d\n", #funcA, __LINE__, g_count);

这很好用但是如果我想为一堆函数执行此操作,我必须复制该宏并为每个新宏将funcA更改为funcB 4次。我宁愿复制它,只需更改宏的名称,而不必更改内部的内容。

我可以通过定义内部宏p来优化上述内容,类似于Basile建议的那样:

#define funcA(...) WRAP(funcA, __VA_ARGS__)

但是,这仍然意味着每次将宏复制到另一个函数时,我需要将funcA更改为新的函数名两次。

1 个答案:

答案 0 :(得分:2)

详细了解C preprocessor。阅读GNU cpp的文档。注意它的stringificationconcatenation能力。

也许通过一些额外的内部宏可能对你有所帮助,所以你可能有像

这样的公共宏
 #define FOO(X,Y,Z) PRIVATE_FOO(FOO,X,Y,Z)

另一个PRIVATE_FOO宏在其第一个参数上执行字符串化技巧,可能是

#define PRIVATE_FOO(Mac,X,Y,Z) do { \
 printf("%s: %s,%s,%s\n", #Mac, #X, #Y, #Z); \
 Z = X+Y; Y=X; \
} while(0)

也许C预处理器不适合您的任务。您可以使用其他工具生成一些C代码(可能是GPP预处理器,或者可能是简单的awkpython脚本,或者可能是某些真正的程序;您需要改变你的构建过程,例如你的Makefile来处理它。如果需要,可以使用GCC自定义MELT编译器。由于我们不了解您的实际动机,我们无法提供更多帮助。

除非你激励并澄清你的问题,否则我无能为力。

您的软链接问题只需要使用一些weak symbols。它可能与C预处理无关。