我懷疑我已經知道這個答案了,但是好奇的是,如果有任何專家有任何技巧。我有一個C庫的目的是作爲一個C框架(不安全的功能未使用,類似的命名約定跨平臺等)構建的C庫。這工作正常,直到我嘗試在C++項目中使用它,其中C'命名空間'函數名與C++保留字衝突,在這種情況下,delete
。C++保留字作爲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));
}
如果您打算將它們提供給C++編譯器,則不能在C代碼中使用C++保留字作爲標識符。 – 2015-03-13 19:45:12
爲什麼不在之前包括頭文件和'#undef delete'之前將'#define delete'改爲別的東西? – 2015-03-13 19:48:00
@R ..這可能是一個非常糟糕的主意!即使使用'#undef'。 – 2015-03-13 19:49:20