C++ 忽略头文件中的主文件

C++ 忽略头文件中的主文件,c++,pragma,redefinition,C++,Pragma,Redefinition,我正试图在项目中使用()。只要包含主标题“ligra.h”,框架就可以工作。问题是,这个头有一个parallel\u main的实现,它是一个围绕main的宏包装器,使用OpenMP技巧。如果我想写一个简单的程序: #include "ligra.h" #include <iostream> int main(){ std::cout<<"Hello World"; return 0; } #包括“ligra.h” #包括 int main(){ std::cout

我正试图在项目中使用()。只要包含主标题“ligra.h”,框架就可以工作。问题是,这个头有一个
parallel\u main
的实现,它是一个围绕
main
的宏包装器,使用
OpenMP
技巧。如果我想写一个简单的程序:

#include "ligra.h"
#include <iostream>

int main(){
std::cout<<"Hello World";
return 0;
} 
#包括“ligra.h”
#包括
int main(){

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

  • #包括“ligra/parallel.h”
    (这并不定义parallel\u main
  • #undef parallel_main
    以防止重写函数名

  • #像往常一样包含“ligra/ligra.h”
    。由于
    parallel.h
    有一个包含保护,它的重复包含被阻止,并且将不会重新定义
    parallel_main

  • 照常进行

  • 您可能还希望将其包装到标题中,这样您只需编写一次


    或者,您可以按照@user463035818的建议进行操作,并重新定义
    main
    ,仅用于包含
    ligra.h
    ,以获得非常相似的效果。区别在于ligra的
    parallel\u main
    函数将获得的名称。

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

  • #包括“ligra/parallel.h”
    (这并不定义parallel\u main)

  • #undef parallel_main
    以防止重写函数名

  • #像往常一样包含“ligra/ligra.h”
    。由于
    parallel.h
    有一个包含保护,它的重复包含被阻止,并且将不会重新定义
    parallel_main

  • 照常进行

  • 您可能还希望将其包装到标题中,这样您只需编写一次


    或者,您可以按照@user463035818的建议进行操作,并重新定义
    main
    仅用于包含
    ligra.h
    以获得非常相似的效果。区别在于
    parallel\u main
    函数的名称从ligra将获得。

    您可以简单地不包括ligra.h。如果该文件中有有用的内容,则创建该文件的副本(不包括主函数)并使用该副本


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

    您可以简单地不包括ligra.h。如果该文件中有有用的内容,则创建该文件的副本(不包括主函数)并使用该副本


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

    这是一个宏,它是
    OpenMP
    CILK
    版本的
    main
    以实现并行性。只需使用相同的脏技巧,并将头括在
    #def中ne main ax123123123
    /
    #undef main
    这确实是一个肮脏的修复程序。然后,我将对并行框架类型进行硬编码,并失去ligra所具有的“灵活性”。@user463035818不确定我是否理解正确,您需要包含标题,但希望“排除”main,对吗?差不多,是的。@user463035818。更准确地说,我希望能够在头以外的文件中重新定义
    parallel\u main
    。您提供的与我想要的非常接近,但不完全相同。它是一个宏,可以是
    OpenMP
    CILK
    版本的
    main
    ,以实现并行性。只需使用t他使用了同样的肮脏伎俩,将标题括在一个
    #define main ax123123123
    /
    #unde main
    中,这确实是一个肮脏的修复程序。然后,我将对并行框架的类型进行硬编码,并失去ligra所具有的“灵活性”。@user463035818不确定我是否理解正确,您需要包含标题,但您希望“排除”main,是吗?差不多,是的。@user463035818。更准确地说,我希望能够在头以外的文件中重新定义
    parallel\u main
    。您提供的内容与我想要的非常接近,但并不完全相同。