【问题标题】:type of expanded C macro扩展 C 宏的类型
【发布时间】:2015-05-18 05:49:59
【问题描述】:

以下标头中的 PETSC_COMM_WORLD 扩展为什么类型和值? 它只是对MPI_Comm 和extern 范围的重新定义吗?

#define PETSC_EXTERN extern PETSC_VISIBILITY_PUBLIC

PETSC_EXTERN MPI_Comm PETSC_COMM_WORLD;

【问题讨论】:

    标签: c macros petsc


    【解决方案1】:

    这是简单的文本替换,所以你最终得到:

    extern PETSC_VISIBILITY_PUBLIC MPI_Comm PETSC_COMM_WORLD;
    

    因此PETSC_COMM_WORLD 的类型为PETSC_VISIBILITY_PUBLIC MPI_Comm,因此取决于PETSC_VISIBILITY_PUBLIC 的定义,尚未提供。

    从网上粗略搜索,构建 petsc DLL 或属性__attribute__((visibility ("default"))) 时使用 时它将为空。

    extern 本身不控制或修改类型(该属性也没有)它只是声明此变量不是在此处创建,但应该在其他地方可用.

    值完全取决于你定义变量的位置、它的作用域、你是否初始化它等等。

    【讨论】:

    • 感谢您的详尽解释;从一个 MPI 实现中,我期待 MPI_COMM_WORLD 和类似的整数常量,在配置后固定。我有兴趣在编译时找出它的价值(我正在用不同的语言包装这个库),这样做的惯用方式是什么?再次感谢
    • @ocramz,您可以使用gcc -E yourfile.c | less 之类的东西在预处理步骤之后 输出翻译单元。那应该给你所有预处理的符号。 Microsoft 有 /P /C 选项,它将为您提供一个包含预处理器输出的 yourfile.i 文件(保留 cmets)。
    • 再次感谢您;我在 Unix 上;但是配置/构建非常复杂(一个非常大的makefile);我想知道是否有一种方法可以编写一个精简的 C 包装器,该包装器公开只返回这些常量值的函数..
    • @ocramz,这也是可能的,比如在main开头:if (argc > 1) { if (strcmp (argv[1],"xyzzy")==0) { printf ("Value of PLUGH is %d\n", PLUGH); return 0; } },然后用myprog xyzzy运行你的代码。
    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 2015-01-27
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多