【问题标题】:List all available function prototypes from within C/C++? [closed]列出 C/C++ 中所有可用的函数原型? [关闭]
【发布时间】:2014-12-24 21:27:33
【问题描述】:

在 C 或 C++ 程序中是否有任何方法可以获取有关所有可调用函数的信息?也许某种编译器宏?我知道有些程序可以接收源文件或 .o 文件并获取符号或原型,我想我可以在 c 程序中运行这些程序,但我很好奇也许返回函数指针到函数或当前范围内可用的函数原型数组,还是相关的?

我的措辞不是很好,但这个问题是我好奇的一部分,我想从程序内部了解一个程序(不一定只通过阅读它自己的代码)。我有点怀疑是否有类似我要求的东西,但我很好奇。

编辑:似乎我想知道但不知道如何很好地描述的是反射是否可以在 C 或 C++ 中实现。谢谢你的回答。

【问题讨论】:

  • 你可以从c/c++程序中调用数十亿个函数,你想要它们吗?
  • 我只看到好奇....具体你想问什么。
  • 你寻求的是反射,而 C++ 还没有。然而,它是未来 C++ 标准的候选者。
  • @Quentin:鉴于 C++ 缺乏一种体面的元编程语言,但只提供了一种基于模板的语言,我对委员会会提出什么感到害怕。
  • @6502 Are you serious?? 不;)

标签: c++ c function-pointers function-prototypes


【解决方案1】:

该语言尚不支持reflection。但是,由于您正在寻找一些信息来源,请查看Boost.Reflect 库,以在一定程度上帮助您在代码中添加反射。另外,请查看 ClangToolinglibclang 以了解可让您进行自动代码分析的库。

【讨论】:

    【解决方案2】:

    C 和 C++ 无法收集所有可用函数的名称

    但是,您可以使用宏来测试标准(ANSI、ISO、POSIX 等)的合规性,然后可以用来保证每个标准功能的存在。

    例如,如果定义了_POSIX_C_SOURCE,您可以(通常)假设 POSIX 指定的函数将可用:

    #ifdef _POSIX_C_SOURCE
    /* you can safely call POSIX functions */
    #else
    /* the system probably isn't POSIX compliant */
    #endif
    

    编辑:如果您使用的是 Linux 系统,您可以在 feature_test_macros(7) 下找到一些常见的兼容性宏。 OS X 和 BSD 应该具有大致相同的宏,即使它们可能没有该手册页。 Windows 使用 WINVER_WIN32_WINNT 宏来控制跨版本的功能可见性。

    【讨论】:

      【解决方案3】:

      没有。

      C++ 元编程能力很弱,不包括任何形式的反射。但是,您可以使用 gcc-xml 之类的工具来解析 C++ 程序并以更易于分析的格式导出其内容。

      为 C++ 编写自己的解析器以提取函数声明将是一场噩梦,除非您只需要在您的特定项目上执行此操作并且您已准备好走捷径。

      【讨论】:

        猜你喜欢
        • 2016-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-22
        相关资源
        最近更新 更多