忽略头文件中的main

时间:2018-08-07 15:02:16

标签: c++ pragma redefinition

我正在尝试在项目中使用(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阶段删除该功能。

我不知道该怎么做的最后一部分,如果有人这样做,那将是您的重担。

2 个答案:

答案 0 :(得分:1)

不涉及修改库文件(但有些脆弱)的解决方案可以执行以下操作:

  1. #include "ligra/parallel.h"(确实#define parallel_main main)。

  2. #undef parallel_main,以防止重写函数名。

  3. #include "ligra/ligra.h"照常。由于parallel.h具有包含保护,因此可以防止其重复包含,并且不会重新定义parallel_main

  4. 正常进行。

您可能还希望将其包装到标头中,因此只需编写一次即可。

或者,您可以执行@ user463035818建议的操作,并仅在包含main的情况下重新定义ligra.h,以获得非常相似的效果。区别在于ligra的parallel_main函数将获得的名称。

答案 1 :(得分:1)

您完全不能包含ligra.h。如果该文件中有有用的东西,请创建该文件的副本-不包括主要功能-并使用该副本。

当然,这意味着如果上游ligra.h被更新,您的副本将没有相应的更改。但是,考虑到“原始开发人员可能已经忘记了他的项目” 的前提,这可能不是问题。如果前提不正确,那么更好的方法是创建拉取请求,以使框架可用作库。