【问题标题】:ignore a main in a header file忽略头文件中的 main
【发布时间】:2018-08-07 15:02:16
【问题描述】:

我正在尝试在项目中使用 (Ligra)。只要包含主要头文件“ligra.h”,该框架就可以工作。麻烦的是,该标头有一个parallel_main 的实现,它是mainOpenMP 诡计的宏包装器。所以如果我想写一个简单的程序:

#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,它将在包含阶段剥离该功能。

我不知道如何做最后一部分,如果有人这样做了,我会非常感激你。

【问题讨论】:

  • 它是一个宏,它是mainOpenMPCILK 版本,用于并行处理。
  • 只需使用相同的肮脏技巧并将标题包含在#define main ax123123123 / #undef main
  • 这确实是一个肮脏的修复。然后,我将硬编码并行框架的类型,并失去 ligra 所具有的“灵活性”。 @user463035818
  • 不确定我是否理解正确,你需要包含标题,但你想“排除”主要,对吧?
  • 差不多,是的。 @user463035818。更准确地说,我希望能够在标题外部的文件中重新定义parallel_main。你提供的和我想要的很接近,但不完全一样。

标签: c++ pragma redefinition


【解决方案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 函数将获得的名称。

【讨论】:

    【解决方案2】:

    您不能简单地不包含ligra.h。如果该文件中有有用的内容,则创建该文件的副本 - 不包括 main 函数 - 并使用该副本。

    当然,这意味着如果上游的 ligra.h 更新,您的副本将不会有相应的更改。然而,鉴于“最初的开发者可能已经忘记了他的项目”的前提,这可能不是问题。如果前提是错误的,那么更好的方法是创建拉取请求以使框架可用作库。

    【讨论】:

      猜你喜欢
      • 2014-01-21
      • 2018-03-20
      • 1970-01-01
      • 1970-01-01
      • 2018-09-26
      • 2015-03-17
      • 2011-12-30
      • 2021-01-07
      • 2012-05-05
      相关资源
      最近更新 更多