C++ 保留字作为 C 结构中的函数指针名称
C++ reserved word as function pointer name in C struct
我想我已经知道这个问题的答案了,但很好奇是否有专家有什么技巧。
我有一个 C 库,旨在成为一个 C 框架(未使用的不安全函数,类似的跨平台命名约定等)。这工作正常,直到我尝试在 C++ 项目中使用它,其中 C 'namespaced' 函数名称与 C++ 保留字冲突,在本例中为 delete
.
这里是 'file' 命名空间,我希望将其删除为函数名称之一:
#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));
}
"is there anyway to bypass this, or shall I simply rename the function to purge or similar?"
int(*const delete)(const char* path);
// ^^^^^^
是的,如果有问题的代码在您的控制之下,您应该重命名它!
您根本不能在 C++ 编译代码中使用名为 delete
的函数指针,因为它是该语言的保留关键字。
您只需使其与关键字不同即可。与其将其重命名为 purge
,这可能会从语义层面产生误导,您仍然可以使用类似
的名称
int(*const delete_)(const char* path);
// ^
使其有别于 C++ 关键字。
关于您提到的 不对称/命名不一致:
只需为所有这些使用 _
后缀。作为给出意见,无论如何,这是我对结构或 类 成员变量的首选样式。
我想我已经知道这个问题的答案了,但很好奇是否有专家有什么技巧。
我有一个 C 库,旨在成为一个 C 框架(未使用的不安全函数,类似的跨平台命名约定等)。这工作正常,直到我尝试在 C++ 项目中使用它,其中 C 'namespaced' 函数名称与 C++ 保留字冲突,在本例中为 delete
.
这里是 'file' 命名空间,我希望将其删除为函数名称之一:
#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));
}
"is there anyway to bypass this, or shall I simply rename the function to purge or similar?"
int(*const delete)(const char* path); // ^^^^^^
是的,如果有问题的代码在您的控制之下,您应该重命名它!
您根本不能在 C++ 编译代码中使用名为 delete
的函数指针,因为它是该语言的保留关键字。
您只需使其与关键字不同即可。与其将其重命名为 purge
,这可能会从语义层面产生误导,您仍然可以使用类似
int(*const delete_)(const char* path);
// ^
使其有别于 C++ 关键字。
关于您提到的 不对称/命名不一致:
只需为所有这些使用 _
后缀。作为给出意见,无论如何,这是我对结构或 类 成员变量的首选样式。