在Doxygen中,如何从示例代码而不是按标记包含函数名称的片段

时间:2014-08-26 17:36:30

标签: documentation doxygen

我知道如何通过标记示例文件的一部分来创建代码段:

//! [myfunc example]
int i = myfunc(1,"example");
if (i = CORRECT_VALUE) printf("success");
//! [myfunc example]

然后将其包含在其他地方:

/snippet mytestfile.c myfunc example

就我而言,我的示例文件是我的测试文件,每个示例实际上已经在一个函数中,如下所示:

void testMyFunc() {
    int i = myfunc(1,"example");
    if (i = CORRECT_VALUE) printf("success");
}

所以我想要的是能够引用这样的片段:

/snippet mytestfile.c#testMyFunc

这样我就不必添加额外的标记了。你会认为因为Doxygen已经解析了代码,我可以参考特定的函数来包含它。

1 个答案:

答案 0 :(得分:1)

我还没有找到任何官方解决方案,但我已经为我做了一个脚本 跳到这可能对你有用,这是一个例子。

项目结构

doc/
 - doxygen.conf
 - generate_doc.sh
 - generate_snippet.sh
src/
 - api.h
 - api.c
test/
 - test_api.c

生成doc

我从项目的根目录运行此命令以使用auto-snippet生成doc:
cd ./doc && ./generate_doc.sh

./doc/doxygen.conf 中,我设置了这个:

EXAMPLE_PATH           = ../test/snippet/

脚本

<强> ./doc/generate_doc.sh

#!/bin/bash
# ./doc/generate_doc.sh

rm  ../test/snippet/*  # Clean old snippet
for file in ../test/*
do
  if [ -f $file ]; then
    ./generate_snippet.sh ../test/$file  # Auto-generate snippet for this file
  fi
done
doxygen doxygen.conf  # Generate documentation

exit $?

<强> ./doc/generate_snippet.sh

#!/bin/bash
# ./doc/generate_snippet.sh

CURRENT_FUNCTION_NAME=""
N_OPEN=0
SNIPPING=0
TARGET="snippet/""`basename "$1"`"    
cd "`dirname "$1"`"
mkdir -p snippet
touch "$TARGET"

while IFS='' read -r line || [[ -n "$line" ]]; do
    if [ $SNIPPING -eq 0 ]; then
        if [ "`echo "$line" | grep -E "^void\ ?\*?.*?\)"`" != "" ]; then
            # Found a function
            SNIPPING=1
            CURRENT_FUNCTION_NAME="`expr "$line" : "^void \?\(.*\?\)(.*\?)"`"
            echo "//! [$CURRENT_FUNCTION_NAME]" >> "$TARGET"
        fi
    fi;
    countopen=${line//[^\{]/}
    countclose=${line//[^\}]/}
    if [[ "$line" == *"{"* ]]; then
        let "N_OPEN+=${#countopen}" # Add number of open
    fi
    if [[ "$line" == *"}"* ]]; then
        let "N_OPEN-=${#countclose}" # Add number of close
    fi
    echo "$line" >> "$TARGET"
    if [ $N_OPEN -eq 0 ] && [ $SNIPPING -eq 1 ]; then
        echo "//! [$CURRENT_FUNCTION_NAME]" >> "$TARGET"
        SNIPPING=0
    fi
done < "$1"
exit 0

详细

  • 要使用./src/api.h中的代码段,您只需添加此行:
    @snippet test_api.c name_of_your_function
  • 我的所有测试函数都会返回void,如果不是您的情况,则必须调整此expr "$line" : "^void \?\(.*\?\)(.*\?)"