【问题标题】:Doxygen can't expand AUTOSAR macrosDoxygen 无法扩展 AUTOSAR 宏
【发布时间】:2020-08-31 06:42:02
【问题描述】:

我正在使用 Doxygen v1.8.9.1 来分析 AUTOSAR C 代码。 AUTOSAR 代码有一些宏来定义变量和函数。像这样的:

#define P2VAR(ptrtype, memclass, ptrclass)  ptrtype *

我尝试更改以下配置:

ENABLE_PREPROCESSING
MACRO_EXPANSION     
EXPAND_ONLY_PREDEF  
EXPAND_AS_DEFINED   
SKIP_FUNCTION_MACROS

无论我做什么,它都无法识别使用这些宏定义的函数和变量。相反,它会看到多个具有相同名称的函数。

例如: 如果我有以下代码:

typedef P2VAR( uint8, AUTOMATIC, DATA_LOCATION)  var_1;
typedef P2VAR( uint8, AUTOMATIC, DATA_LOCATION)  var_2;
typedef P2VAR( uint8, AUTOMATIC, DATA_LOCATION)  var_3;

它不会看到 3 个 uint8 类型的变量名称 var_1, var_2, var_3 但它看到 3 个同名的函数 P2VAR

xml 输出示例:

任何人以前见过这个并能够解决它?

【问题讨论】:

  • “它看到 3 个功能”是什么意思?前面的typedef 让我感到困惑。
  • 只是为了做一个实验(或者是为了让问题描述更加尖锐),如果在使用前插入宏定义会怎样?
  • @RubberBee 它在输出中将它们显示为函数(请参阅添加到问题中的屏幕截图)。
  • 我还尝试了其他宏,其中定义就在使用之前。我得到同样的结果。这就是为什么我怀疑我有一些全局配置问题。
  • 版本 1.8.9.1 有点旧(2015 年 1 月),当前版本是 1.8.20。当您使用当前版本时会发生什么?

标签: c doxygen autosar


【解决方案1】:

如果我使用你的代码:


#define P2VAR(ptrtype, memclass, ptrclass)  ptrtype *


typedef P2VAR( uint8, AUTOMATIC, DATA_LOCATION)  var_1;
typedef P2VAR( uint8, AUTOMATIC, DATA_LOCATION)  var_2;
typedef P2VAR( uint8, AUTOMATIC, DATA_LOCATION)  var_3;

并作为 doxygen 配置文件:

QUIET=YES
EXTRACT_ALL=YES
ENABLE_PREPROCESSING=YES
MACRO_EXPANSION  =YES
EXPAND_AS_DEFINED=YES
GENERATE_XML=YES

我在定义部分和索引中只看到一次P2VAR(当然在代码部分)。 我在 doxygen 1.8.20 版和 1.8.9.1 版的情况下看到了这一点

【讨论】:

  • 感谢您的帮助。当我用简单的一两个文件尝试它时,它工作正常。但它不适用于大型代码库(至少对于 AUTOSAR 宏和其他一些宏)。只有当我在 PREDEFINED 标记中添加宏定义时,它才对我有用。我会把它放在一个单独的答案中,以便更明显。
  • 在我之前的评论(带有问题)中,我写道:“版本 1.8.9.1 有点旧(2015 年 1 月),当前版本是 1.8.20。当您使用当前版本时会发生什么?” 这个版本对吗?使用 1.8.20 版本会发生什么?
  • 是的,我使用的是 v1.8.9.1,因为这是项目推荐的版本。我尝试使用 v1.8.20 并得到相同的行为。
  • 奇怪,看看它出错的确切情况会很有趣。我不知道谁推荐了 1.8.9.1,5 年前还可以,但我认为现在最好使用 1.8.20 来使用 doxygen 中内置的更新功能。
【解决方案2】:

当我尝试一个简单的代码时,它可以正常工作,就像@albert 的答案中提到的那样,但它仍然不能用于大型代码。

对我有用的是在 PREDEFINED 配置中添加宏,如下所示:

PREDEFINED             = "FUNC(rettype,memclass)=rettype" \
                         "P2VAR(ptrtype,memclass,ptrclass)=ptrtype *" \
                         "VAR(type,memclass)=type"

【讨论】:

  • 在我之前的评论(带有问题)中,我写道:“版本 1.8.9.1 有点旧(2015 年 1 月),当前版本是 1.8.20。当您使用当前版本时会发生什么?” 这个版本对吗?使用 1.8.20 版本会发生什么?
猜你喜欢
  • 2014-02-24
  • 2021-07-17
  • 2011-07-19
  • 2021-09-14
  • 1970-01-01
  • 1970-01-01
  • 2019-06-25
  • 1970-01-01
  • 2012-08-13
相关资源
最近更新 更多