我有一個像下面這樣的模板類。它意味着要用32位字或64位字實例化。如何在預處理器中使用sizeof和模板參數?
foo.h
template <typename WORD>
class Foo
{
public:
...
void Init();
...
private:
WORD* m_ptr;
};
foo.cpp
template <typename WORD>
void Foo<WORD>::Init()
{
#if (sizeof(WORD) == 8)
// Do something
#elif (sizeof(WORD) == 4)
// Do something else
#endif
}
編譯它導致error: missing binary operator before token "("
GCC下的;和token is not a valid binary operator in a preprocessor subexpression
根據Cla。
我不想提供單獨的專業化,因爲這是代碼模板的確切種類。我也相信它會破壞我們用基類指針和引用(在派生類中)做的一些事情。
如何訪問模板參數WORD
的大小並使用它來選擇代碼路徑?
下面的工作很好,但它生成我試圖壓制警告。例如,它產生Coverity的下result_independent_of_operands
:
WORD unused;
if (sizeof(unused))
{
...
}
我也得到了預處理器的編譯器之前運行。我對此沒有任何誤解(例如,sizeof() is not executed by preprocessor和朋友)。
但是,源代碼在預處理器運行之前很久就被保存下來,並且uint32_t
和uint64_t
的大小永不改變,因此所有這些信息在編譯過程的每個階段都可用。我只是不知道如何訪問它。
我認爲功能應該聲明'constexpr'即用'-std = C++ 11'標誌 – smac89
到底有什麼不對勁只'如果(的sizeof(WORD)== 4){... }'?使用預處理器肯定是死路一條。 –
@ T.C。 - 正如我所解釋的,它會在分析工具下產生警告。清潔的編譯和清理分析是我們的安全門,所以我們竭盡全力與所有工具配合使用。 – jww