2015-03-13 38 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