Vc ++ / c ++强制包含标头异常

时间:2015-06-24 08:03:07

标签: c++ visual-studio visual-c++ makefile

所以我一直在使用makefile和g ++在Linux中开发一个项目,但现在我希望它在Visual Studio上的Windows中运行。所以我的项目有一个特殊的cpp和.h文件。只有1.我配置.h自动在所有cpp文件中包含.h文件,除了特殊的cpp文件。但是,我似乎无法在Visual Studio中这样做。

我基本上是在编写自己的vcxproj文件,因此我查找了配置设置,并在设置中找到了Force Include标志。但我似乎找不到办法让这个例外。

我还尝试修改.h文件,以便它可以识别它所包含的位置,并通过预处理指令(如#if和“__FILE__”)表现不同。但我发现“__FILE__”将以任何方式返回.h,而不是源。

我用完了想法和关键字来搜索谷歌。那么任何想法或线索?

先谢谢。

修改

在Linux上运行的示例代码:

Special.h

class Test{
private:
Test() = delete;
Test(const Test&) = delete;
Test(Test&&) = delete;
public:
    void print(const char*);
};
extern TEST t1;

Special.cpp

#include <iostream>
class Test{    //Singleton Class
private:
Test();    //Note that this line is different from the .h
Test(const Test&) = delete;
Test(Test&&) = delete;
public:
    static Test& getInstance();    //Note that this line is missing from the .h
    void print(const char*);
};
Test::Test(){}
Test& Test::getInstace(){
    static Test inst;
    return return inst;
}
void Test::print(const char* msg){
    std::cout << msg << std::endl;
}
Test t1 = Test::getInstance();    

Main.cpp的

int main(){
    t1.print("Hello World!");
}

生成文件:

all: App-Main

App-Main: Main.o Special.o
    g++ Main.o Special.o
Special.o: Special.cpp
    g++ -c $< $@ -std=c++11
%.o: %.cpp
    g++ -c $< $@ -std=c++11 -include Special.h

到目前为止,这是在Linux中运行的代码。没有构建错误。 如果我们在Special.h中加入Special.cpp,则会出现问题。 现在,请假设有理由不在.c文件中包含.h文件。

2 个答案:

答案 0 :(得分:1)

定义 中的<{em>} 头文件和源文件中的类Test。删除源文件中的类定义,并仅保留成员函数实现。

当您向预处理器询问#include文件时,它确实包含了#include指令所在地的实际内容。

预处理后,您的文件看起来像

...
class Test{
public:
    void print(const char*);
};

class Test{
public:
    void print(const char*);
};
void Test::print(const char* msg){
    std::cout << msg << std::endl;
}

答案 1 :(得分:0)

最简单的解决方案是#include“Special.h”到处都是。当然,它有一个头球卫士。现在在编写“Special.cpp”时,也传递$subject = 'A enquiry for The Retros!' // <--- Here a ; should be added. $name = $_POST['name']; $email = $_POST['email']; 。标题仍将在物理上包含,但逻辑上会跳过。

当然,你想要这样做的原因(故意的ODR违规)是相当可疑的,并且实际结果并不能保证。例如,链接时代码生成(LTCG)违反了您的“哑链接器”假设。