忽略 header 文件中的 main
ignore a main in a header file
我正在尝试在项目中使用 (Ligra)。只要包含 chief header "ligra.h" 框架就可以工作。问题是,header 有一个 parallel_main
的实现,它是 main
的宏包装器,带有 OpenMP
技巧。所以如果我想写一个简单的程序:
#include "ligra.h"
#include <iostream>
int main(){
std::cout<<"Hello World";
return 0;
}
它不会编译。重新定义符号 main
。
另外,我需要一个 parallel_main
,在 "parallel.h"
header 中完成了精确的宏技巧。
所以我想我有两个选择:
1) 修改文件,增加一对#ifdef LIGRA_MAIN
,编译时不定义宏。因此我可以拥有自己的 main
而无需重新定义。问题是我需要我的项目使用 ligra 的上游版本,而原始开发人员 Julian Shun 可能已经忘记了他的项目(github,因为他忽略了不止一个 pull request)。
2) Use/Write a #pragma
将在包含阶段删除该函数。
我不知道如何做最后一部分,如果有人知道,我会非常感激你。
不涉及修改库文件(但有点脆弱)的解决方案可能是执行以下操作:
#include "ligra/parallel.h"
(#define parallel_main main
)。
#undef parallel_main
以防止重写函数名称。
#include "ligra/ligra.h"
照常。由于 parallel.h
有一个包含保护,它的重复包含被阻止并且 parallel_main
不会被重新定义。
照常进行。
您可能还想将它包装成一个 header,这样您只需编写一次。
或者,您可以按照@user463035818 的建议重新定义 main
仅用于包含 ligra.h
以获得非常相似的效果。不同之处在于来自 ligra 的 parallel_main
函数将获得的名称。
您可以不包含 ligra.h。如果该文件中有有用的东西,则创建该文件的副本 - 不包括主要功能 - 并使用该副本。
当然,这意味着如果上游ligra.h更新,您的副本将不会有相应的更改。但是,鉴于前提 "the original developer has probably forgottten about his project",这可能不是问题。如果前提是错误的,那么更好的方法是创建拉取请求以使框架可用作库。
我正在尝试在项目中使用 (Ligra)。只要包含 chief header "ligra.h" 框架就可以工作。问题是,header 有一个 parallel_main
的实现,它是 main
的宏包装器,带有 OpenMP
技巧。所以如果我想写一个简单的程序:
#include "ligra.h"
#include <iostream>
int main(){
std::cout<<"Hello World";
return 0;
}
它不会编译。重新定义符号 main
。
另外,我需要一个 parallel_main
,在 "parallel.h"
header 中完成了精确的宏技巧。
所以我想我有两个选择:
1) 修改文件,增加一对#ifdef LIGRA_MAIN
,编译时不定义宏。因此我可以拥有自己的 main
而无需重新定义。问题是我需要我的项目使用 ligra 的上游版本,而原始开发人员 Julian Shun 可能已经忘记了他的项目(github,因为他忽略了不止一个 pull request)。
2) Use/Write a #pragma
将在包含阶段删除该函数。
我不知道如何做最后一部分,如果有人知道,我会非常感激你。
不涉及修改库文件(但有点脆弱)的解决方案可能是执行以下操作:
#include "ligra/parallel.h"
(#define parallel_main main
)。#undef parallel_main
以防止重写函数名称。#include "ligra/ligra.h"
照常。由于parallel.h
有一个包含保护,它的重复包含被阻止并且parallel_main
不会被重新定义。照常进行。
您可能还想将它包装成一个 header,这样您只需编写一次。
或者,您可以按照@user463035818 的建议重新定义 main
仅用于包含 ligra.h
以获得非常相似的效果。不同之处在于来自 ligra 的 parallel_main
函数将获得的名称。
您可以不包含 ligra.h。如果该文件中有有用的东西,则创建该文件的副本 - 不包括主要功能 - 并使用该副本。
当然,这意味着如果上游ligra.h更新,您的副本将不会有相应的更改。但是,鉴于前提 "the original developer has probably forgottten about his project",这可能不是问题。如果前提是错误的,那么更好的方法是创建拉取请求以使框架可用作库。