C++保留字作为C结构中的函数指针名

ZXc*_*bnM 3 c c++ reserved-words visual-studio-2013

我怀疑我已经知道了这个问题的答案,但是如果有任何专家有任何技巧,我很好奇.

我有一个C库,其目的是成为一个C框架(不安全的函数未使用,类似的跨平台命名约定等).这很好用,直到我尝试在C++项目中使用它,在这种情况下,C'名称空间'函数名与C++保留字冲突delete.

这是'文件'命名空间,我希望删除它是函数名之一:

#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
Run Code Online (Sandbox Code Playgroud)

现在我正在使用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));
}
Run Code Online (Sandbox Code Playgroud)

πάν*_*ῥεῖ 6

"无论如何要绕过这个,或者我只是简单地将功能重命名为清除或类似?"

  int(*const delete)(const char* path);
          // ^^^^^^
Run Code Online (Sandbox Code Playgroud)

是的,如果相关代码在您的控制之下,您应该重命名它!
您根本无法使用delete在C++编译代码中命名的函数指针,因为它是该语言的保留关键字.

您只需要使其与关键字不同.purge您可以使用类似的东西,而不是将其重命名为可能从语义级别误导

int(*const delete_)(const char* path);
              // ^
Run Code Online (Sandbox Code Playgroud)

使它与C++关键字区别开来.


关于你的评论提到了不对称/不一致的命名:
只需_对所有这些命名使用后缀.作为一个意见,无论如何,这是结构或类的成员变量的首选样式.

  • 或者 `delet` 作为对 [`creat`] 的致敬(https://unix.stackexchange.com/questions/10893/what-did-ken-thompson-mean-when-he-said-id-spell-create-with -an-e?rq=1)。:3 (2认同)