2015-03-13 71 views
3

我懷疑我已經知道這個答案了,但是好奇的是,如果有任何專家有任何技巧。我有一個C庫的目的是作爲一個C框架(不安全的功能未使用,類似的命名約定跨平臺等)構建的C庫。這工作正常,直到我嘗試在C++項目中使用它,其中C'命名空間'函數名與C++保留字衝突,在這種情況下,deleteC++保留字作爲C中的函數指針名稱struct

這裏的「文件」命名空間,在這裏我希望它刪除是函數名稱之一:

#include <stdio.h> 

#if defined(__linux__) || defined(BSD) 
# include <fcntl.h> 
#endif 


#if defined(__cplusplus) 
# if defined(_MSC_VER) 
#  pragma warning (push) 
     // Disable: default constructor could not be generated 
#  pragma warning (disable : 4510) 
     // Disable: assignment operator could not be generated 
#  pragma warning (disable : 4512) 
     // Disable: struct <unnamed-tag> can never be instantiated 
#  pragma warning (disable : 4610) 
# endif 
extern "C" { 
#endif 



typedef struct 
{ 
    int(*const close)(FILE* fp); 
    int(*const copy)(const char* src, const char* dest); 
    int(*const delete)(const char* path); 
    int(*const flush)(FILE* fp); 
    long(*const get_file_size)(FILE* fp); 
    long(*const get_size)(const char* path); 
    FILE*(*const open)(const char* name, const char* modes); 
    int(*const path_exists)(const char* path); 
    size_t(*const read)(void* ptr, size_t size, size_t count, FILE* stream); 
    size_t(*const write)(const void* ptr, size_t size, size_t count, FILE* stream); 

} namespace_file; 

extern namespace_file const file; 



#if defined(__cplusplus) 
} // extern "C" 
# if defined(_MSC_VER) 
#  pragma warning (pop) 
# endif 
#endif 

現在我使用GTEST編寫一些測試,並遇到了保留字的問題 - 是否有無論如何繞過這個,或者我應該簡單地重命名爲purge或類似的功能?

TEST(cfwkFile, fDelete) 
{ 
    // all three of these error as 'delete' is reserved 
    EXPECT_EQ(0, file.delete(CFWK_TEST_FAIL_FILE)); 
    EXPECT_EQ(1, file.delete(CFWK_TEST_PASS_FILE)); 
    EXPECT_EQ(1, file.delete(CFWK_TEST_PASS_FILE_COPY)); 
} 
+3

如果您打算將它們提供給C++編譯器,則不能在C代碼中使用C++保留字作爲標識符。 – 2015-03-13 19:45:12

+1

爲什麼不在之前包括頭文件和'#undef delete'之前將'#define delete'改爲別的東西? – 2015-03-13 19:48:00

+1

@R ..這可能是一個非常糟糕的主意!即使使用'#undef'。 – 2015-03-13 19:49:20

回答

5

「反正是有繞過這個,否則我就簡單地命名以清除或類似的功能是什麼?」

int(*const delete)(const char* path); 
      // ^^^^^^ 

是的,你應該將其重命名,如果有問題的代碼是你的控制之下!
在C++編譯代碼中,您只能使用名爲delete的函數指針,因爲它是該語言的保留關鍵字。

你只需要使它與關鍵字不同。相反,它重命名爲purge,這可能從語義層面上誤導的,你仍然可以使用類似

int(*const delete_)(const char* path); 
       //^

得到它從C++關鍵字不同。


關於你的意見提的那種不對稱/不一致的命名
只需使用一個_後綴爲他們所有。作爲一個觀點,無論如何,這是我對結構或類的成員變量的首選樣式。

+0

是的,想知道是否有人有任何魔術來繞過它,但沒有得到我的希望!只是想要一個'預期'的函數名稱,'刪除'一個文件比'清除'顯着更常見 - 嘿! – ZXcvbnM 2015-03-13 19:52:08

+0

@ZXcvbnM你仍然可以使用像'delete_'這樣的語義關注點。 – 2015-03-13 19:53:56

+0

'unlink'怎麼樣? – 2015-03-13 19:56:16