【发布时间】:2018-08-07 15:02:16
【问题描述】:
我正在尝试在项目中使用 (Ligra)。只要包含主要头文件“ligra.h”,该框架就可以工作。麻烦的是,该标头有一个parallel_main 的实现,它是main 和OpenMP 诡计的宏包装器。所以如果我想写一个简单的程序:
#include "ligra.h"
#include <iostream>
int main(){
std::cout<<"Hello World";
return 0;
}
它不会编译。重新定义符号main。
另外,我需要一个parallel_main,在"parallel.h" 标头中完成了精确的宏技巧。
所以我认为我有两个选择:
1) 修改文件,添加一对#ifdef LIGRA_MAIN 并且在编译时不定义宏。因此,我可以拥有自己的main 而无需重新定义。问题是我需要我的项目使用上游版本的 ligra,而最初的开发者 Julian Shun 可能已经忘记了他的项目(以及 github,因为他忽略了多个拉取请求)。
2) 使用/编写一个#pragma,它将在包含阶段剥离该功能。
我不知道如何做最后一部分,如果有人这样做了,我会非常感激你。
【问题讨论】:
-
它是一个宏,它是
main的OpenMP或CILK版本,用于并行处理。 -
只需使用相同的肮脏技巧并将标题包含在
#define main ax123123123/#undef main中 -
这确实是一个肮脏的修复。然后,我将硬编码并行框架的类型,并失去 ligra 所具有的“灵活性”。 @user463035818
-
不确定我是否理解正确,你需要包含标题,但你想“排除”主要,对吧?
-
差不多,是的。 @user463035818。更准确地说,我希望能够在标题外部的文件中重新定义
parallel_main。你提供的和我想要的很接近,但不完全一样。
标签: c++ pragma redefinition