2011-06-19 84 views
0

我有一個包含用戶必須遵循的特定規則集的標題。如果用戶不想遵循這些規則,他們必須定義一個預處理器宏來禁用檢查。如果用戶正在使用該庫,則用戶必須在其每個類中包含標題,這些類使用庫中的任何代碼,或者由上述預處理器明確指出(在這種情況下,標題可能會隱式包含[使用一個這是好的):強制在項目中包含標題

// User using my library, they must include the BaseHeader.h or otherwise use the following define 
// #define NOT_USING_BASE_HEADER //(can of course be defined project wide) 
#include <BaseHeader.h> 
// ... other includes (not necessarily from my library) 
class Foo 
{ 
    //... 
}; 

有沒有辦法做到這一點?請記住,基礎標題也包含在內

+0

這是什麼規則?他們的東西是由編譯器理解的,還是僅供人閱讀的文本?你真的想完成什麼? –

+0

難道你不能只是讓你的庫的所有其他頭文件包含BaseHeader.h文件嗎? – Sven

+4

甚至不要去那裏。 C++必須被理解語言和設計的人使用,*強迫*開發人員的事情是開發人員或強迫開發人員出現問題的跡象。 –

回答

1

我不確定我是否完全理解了您的問題,但您認爲這會有所幫助嗎?

BaseHeader.h:


#pragma once 
#define BASE_HEADER_INCLUDED 
... 

internal_header.h:


#pragma once 

#ifdef NOT_USING_BASE_HEADER 
    #ifdef BASE_HEADER_INCLUDED 
     #error You can't both define NOT_USING_BASE_HEADER and include the base-header-file. 
    #endif 
    ... 
#elseif defined BASE_HEADER_INCLUDED 
    ... 
#else 
    #error You have to either define NOT_USING_BASE_HEADER or include the base header file! 
#endif 

如果你想它,使它不會採取 「內部」 包括baseheader.h,那麼你必須添加/刪除一個定義,以確保它沒有定義它:

internal_header.h:


#pragma once 

#define SKIP_HEADER_DEFINE 
#include 
#undef SKIP_HEADER_DEFINE 

而且在BaseHeader.h:


#pragma once 
#ifndef SKIP_HEADER_DEFINE 
    #define BASE_HEADER_INCLUDED 
#endif 

乾杯, 西蒙

+0

那麼這些規則是在'internal_header'還是'BaseHeader'? – Samaursa

+0

不幸的是。在大多數情況下,您只需在internal_header中定義一個簡單的定義,或者在外部定義一個。那麼你可能需要在內部執行規則。儘管如此,你也可以爲它製作一些簡化的宏。 – Simon

+0

好吧,這是有道理的,在我的情況下爲我工作。我創建了另一個內部的頭部,這兩個頭部都包含在內部,因此我不必輸入規則兩次。謝謝! – Samaursa

1

我看到至少有兩個選擇:

  1. 文件的用戶都必須做到這一點。這需要在前面,而不是埋藏十英里深。你正在使用你的圖書館,不遵循你的規則未定義的行爲(顯然,就語言而言,不是UB,但就你的圖書館而言,你的圖書館是因爲你這樣說的UB)。

  2. 爲他們做。製作所有標題#include BaseHeader.h。不要讓用戶選擇調用UB或以其他方式搞砸。

順便說一句,BaseHeader.h不是庫頭的最好名稱。你要求名稱衝突,那就是C++未定義的行爲,而UB是你的錯。

+0

'BaseHeader.h'不是名稱...爲了避免踩任何NDA條款,我沒有提到這個名稱,但提出了一個適合問題背景的名稱(我可能在這裏過於謹慎) – Samaursa

+0

Point taken ,Samaursa。在提供商業祕密等方面總是很謹慎。 –