奇怪的VS2012 C ++解析

时间:2012-10-06 19:27:32

标签: c++ visual-studio-2012

connector.hpp

#ifndef __CONNECTOR_HPP_
#define __CONNECTOR_HPP_

#include <a/b/c/connection.hpp>

namespace a {
    namespace b {
        namespace c {

        class connector {
        public:
            explicit connector(const int port);
            void run();
            void stop();
        };

    }
}
}
#endif

connection.hpp

#ifndef __CONNECTION_HPP_
#define __CONNECTION_HPP_

#include <a/b/c/connector.hpp>

namespace a {
    namespace b {
        namespace c {

            class connection {
            private:
              connector owner_; //line 42

            };

        }
    }
}

#endif

这些简单的类在cpp文件中有一些简单的(空)实现。
当我尝试编译时VS2012说这个:

  

错误1错误C2146:语法错误:缺少';'在标识符'owner_'c之前:\ a \ b \ c \ connection.hpp 42 1 test

     

错误2错误C4430:缺少类型说明符 - 假定为int。注意:C ++不支持default-int c:\ a \ b \ c \ connection.hpp 42 1 test

问题是VS编辑器没有看到任何问题 - 没有红色下划线等。 包含路径设置正确,我已将$(SolutionDir)\..\添加到包含内容,以便我可以使用a/b/c之类的完整路径而不是相对路径。

尽管如此,这并没有编译......但它只做了一次。

问:为什么?

2 个答案:

答案 0 :(得分:3)

这些循环#include指令通常都是致命的。这肯定是这里发生的事情。假设您在其他文件中#include "connector.hpp"。会发生什么是connector.hpp将#include "connection.hpp"。此文件将依次为#include "connector.hpp",但现在这是一个无操作,因为connector.hpp的包含保护已经处于活动状态。您最终得到的是在class connection之前定义class connector。这是一个问题,因为class connection中的数据成员是class connector的实例。

为什么connector.hpp包括connection.hpp?

答案 1 :(得分:0)

在我看来,你已经包含了循环。

即您在connection.hppconnector.hppconnector.hpp包含connection.hpp

忽略connector.hpp中的#include <a/b/c/connection.hpp>

我认为问题可能是编译器开始编译connector.hpp然后预处理器看到#include <a/b/c/connection.hpp>用.hpp文件的内容替换#include(粗略地说)当它尝试时要包含connector.hpp,它会检查警卫并看到__CONNECTOR_HPP_已定义并跳过它,因为class connector尚未声明它会产生此错误。

PS:哦,没关系,我看到它已经回答了。