我怀疑我已经知道这个答案了,但是好奇的是,如果有任何专家有任何技巧。我有一个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