我遇到了一個奇怪的問題,那種破壞我對編譯單元封裝的理解。在不同的編譯單元中編譯具有不同編譯標誌的相同頭文件
簡而言之,我有一個從頭部獲得的公共內聯函數。
我將其包含到2個不同的.cpp文件中,使用不同的#define
宏。
但我最終在bot編譯單元中獲得了相同的實現。
COMMON.H:
#include <iostream>
inline void printA()
{
#ifdef YES
std::cout << " yes" << std::endl;
#else
std::cout << " no" << std::endl;
#endif
}
File1.h:
void print1();
File1.cpp:
#define YES
#include "Common.h"
#include "File1.h"
void print1()
{
printA();
}
File2.h:
void print2();
File2.cpp
#include "Common.h"
#include "File2.h"
void print2()
{
printA();
}
main.cpp中:
#include "File1.h"
#include "File2.h"
int main(int argc, char* argv[])
{
print1();
print2();
return 0;
}
輸出這個例子是:
yes
yes
我希望它是:
yes
no
那麼,爲什麼是相同的實現在兩個編譯單元中採用?
通用功能甚至內聯....
如何獲得我的「預期」結果?
而且,爲什麼選擇「是」實現?只是一個彙編命令的問題?
順便說一句,我得到了同樣的結果在GCC 4.8和VS2012
在file2.cpp中,你包含'file.h',我沒有看到。 – Brahim
請**編輯您的帖子**的內容* Common.h *。 –
我仍然看到file.hpp包含file.hpp – Brahim