我正在尝试在项目中使用(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
,它将在include阶段删除该功能。我不知道该怎么做的最后一部分,如果有人这样做,您将承担很大的债务。
最佳答案
一个不涉及修改库文件(但有些脆弱)的解决方案可以执行以下操作:#include "ligra/parallel.h"
(这是#define parallel_main main
)。#undef parallel_main
防止函数名的这种重写。#include "ligra/ligra.h"
照常。由于parallel.h
具有包含保护,因此可以防止其重复包含,并且不会重新定义parallel_main
。
照常进行。
您可能还希望将其包装到标头中,因此只需编写一次即可。
或者,您可以执行@ user463035818建议的操作,并仅在包含main
时重新定义ligra.h
,以获得非常相似的效果。区别在于ligra的parallel_main
函数将获得的名称。