所以我一直在使用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文件。
答案 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)违反了您的“哑链接器”假设。