【发布时间】: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;
【问题讨论】:
以下标头中的 PETSC_COMM_WORLD 扩展为什么类型和值?
它只是对MPI_Comm 和extern 范围的重新定义吗?
#define PETSC_EXTERN extern PETSC_VISIBILITY_PUBLIC
PETSC_EXTERN MPI_Comm PETSC_COMM_WORLD;
【问题讨论】:
这是简单的文本替换,所以你最终得到:
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_COMM_WORLD 和类似的整数常量,在配置后固定。我有兴趣在编译时找出它的价值(我正在用不同的语言包装这个库),这样做的惯用方式是什么?再次感谢
gcc -E yourfile.c | less 之类的东西在预处理步骤之后 输出翻译单元。那应该给你所有预处理的符号。 Microsoft 有 /P /C 选项,它将为您提供一个包含预处理器输出的 yourfile.i 文件(保留 cmets)。
main开头:if (argc > 1) { if (strcmp (argv[1],"xyzzy")==0) { printf ("Value of PLUGH is %d\n", PLUGH); return 0; } },然后用myprog xyzzy运行你的代码。