代码之家  ›  专栏  ›  技术社区  ›  choxsword

有没有一种方法可以向前声明一个名称空间,或者只是让它提前可见?

c++
  •  0
  • choxsword  · 技术社区  · 7 年前

    我在做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 回复  |  直到 7 年前
        1
  •  3
  •   Bathsheba    7 年前

    最接近转发声明的内容 namespace 就是依赖于他们可以分开的事实(不像 class 声明),甚至变成不同的翻译单位!因此你可以写

    namespace funcion // [sic]
    {
    }
    

    之前 main 。注意大括号。

        2
  •  2
  •   Bo Persson Touseef    7 年前

    如果不必转发声明函数是最重要的目标,那么可以滥用这样一个事实,即类还定义了一个命名空间作用域,而不必在其中转发声明成员函数。

    类似这样:

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

    从技术上讲,这是可行的,但仍不推荐使用。

        3
  •  1
  •   Kos    7 年前

    这不能解决你的问题。

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

    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() 最后,这样就不需要额外的声明