有没有办法转发声明命名空间或只提前使其可见?

时间:2018-03-05 14:03:37

标签: c++

我正在进行在线编程测试,例如leetcode,,只需要一个.cpp文件,因此我必须将所有内容放在一个.cpp文件中。

我曾经在任何其他函数之前编写main()函数,但是这样我必须转发声明我使用的每个函数,这非常烦人。所以我想到下面的代码片段:

 namespace function;//oop,there is no such forward declaration
    int main()
    {
      using namespace function;//compiler could not find this actually;
      f1();
      ...
    }
    namespace function
    {
      f1(){...};
      f2(){...};
      ...
    }

但是编译器抱怨,因为没有名称空间的前向声明(与函数不同),这使得命名空间对编译器不可见。

有没有办法转发声明命名空间?就像

一样
void f1();
int main()
{
 f1();//ok,because there is a forward declaration
}
void f1()
{ ...}

3 个答案:

答案 0 :(得分:3)

最接近声明namespace的事情是依赖于它们可以被分割(与class声明不同),甚至可以分成不同的翻译单元!因此你可以写

namespace funcion // [sic]
{
}
main之前

。请注意大括号。

答案 1 :(得分:2)

如果不必转发声明函数是最重要的目标,那么您可以滥用这样一个事实:类也定义了一个名称空间范围,您不必转发声明成员函数。

这样的事情:

struct program
{

    int main()
    {
      f1();
      f2();

      return  0;
    }

    void f1(){}
    void f2(){}

};

// The real main still needed here

int main()
{ return program{}.main(); }

从技术上讲,这有效,但仍然没有真正推荐。

答案 2 :(得分:1)

这不会解决您的问题。

您可以像这样声明命名空间:

namespace function {};
int main()
{
  using namespace function;
  f1();
}
namespace function
{
  void f1() {}
}

f1仍未声明main

如何将函数声明提取到头文件并包含它?

somefile.h

#pragma once
namespace function {
  void f1();
};

somefile.cpp

#include "somefile.h"

int main()
{
  using namespace function;//compiler could not find this actually;
  f1();
}

namespace function
{
  void f1() {}
}
  

所以我必须将所有内容放在一个.cpp文件中

然后忘记#include并执行以下操作之一:

一个。将声明namespace function { void f1(); }置于int main()之上,将定义(功能正文)置于int main()

之下

湾把int main()放在最后,这样就不需要额外的声明了