与C中嵌套宏的宏等价

时间:2013-09-07 19:44:22

标签: c macros c-preprocessor

以下内容摘自libpng的pngconf.h:
libpng版本1.6.3 - 2013年7月18日
版权所有(c)1998-2013 Glenn Randers-Pehrson

我的问题是,给出以下宏预处理器:

#ifndef PNG_FUNCTION 
#define PNG_FUNCTION(type, name, args, attributes) attributes type name args
#endif

#ifndef PNG_EXPORTA

#define PNG_EXPORTA(ordinal, type, name, args, attributes)\
   PNG_FUNCTION(PNG_EXPORT_TYPE(type),(PNGAPI name),PNGARG(args), \
    extern attributes)
#endif

#ifndef PNG_EXPORT_TYPE
#define PNG_EXPORT_TYPE(type) PNG_IMPEXP type
#endif

#ifndef PNGAPI
#define PNGAPI PNGCAPI
#endif

#define PNGCAPI __cdecl

#ifndef PNGARG
#define PNGARG(arglist) arglist
#endif

是以下等价物吗?

#ifndef PNG_EXPORTA

#define PNG_EXPORTA(ordinal, type, name, args, attributes)\
  PNG_FUNCTION(PNG_EXPORT_TYPE(type),(PNGAPI name),PNGARG(args), \
    extern attributes)
#endif

相当于:

#ifndef PNG_EXPORTA
#define PNG_EXPORTA(ordinal, type, name, args, attributes)\
extern attributes PNG_EXPORT_TYPE(type) (PNGCAPI name) PNGARG(args) 
#endif

最终相当于:

#ifndef PNG_EXPORTA

#define PNG_EXPORTA(ordinal, type, name, args, attributes)\
extern attributes PNG_IMPEXP type __cdecl name arglist 
#endif

1 个答案:

答案 0 :(得分:1)

@OliverCharlesworth写道:

  

大多数编译器允许您查看预处理器输出。例如,使用-E标志运行GCC。

@lurker写道:

  

乍一看,我会说对等问题的答案是“不”。我想你在翻译PNG_FUNCTION宏时插入了一些它们不存在的逗号。欢迎来到SO代码解析服务。 ;)

@JonathanLeffler写道:

  

你有extern attributes,,你应该只有extern attributes