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



我正在做像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()
{ ...}

最接近前向声明namespace的事情是依赖于它们可以拆分(与class声明不同(的事实,甚至可以拆分为不同的翻译单元!因此你可以写

namespace funcion // [sic]
{
}

main之前.注意好牙套。

如果最重要的目标不必转发声明函数,则可以滥用这样一个事实,即类还定义了命名空间范围,而不必转发声明成员函数。

像这样:

struct program
{
    int main()
    {
      f1();
      f2();
      return  0;
    }
    void f1(){}
    void f2(){}
};
// The real main still needed here
int main()
{ return program{}.main(); }

从技术上讲,这是有效的,但仍然不推荐。

这不会解决你的问题。

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

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并执行以下操作之一:

a. 将声明namespace function { void f1(); }放在int main()上面,将定义(函数体(放在下面int main()

b. 将int main()放在最后,这样就不需要其他声明

最新更新