2015-03-13 5 views
3

Я подозреваю, что знаю ответ на это уже, но мне любопытно, есть ли у каких-либо экспертов какие-либо трюки.C++ зарезервированное слово как имя указателя функции в C struct

У меня есть библиотека 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 

Теперь я пишу некоторые тесты с использованием 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++. –

+1

Почему бы просто «#define удалить» что-то еще, прежде чем включать заголовок и '#undef delete' впоследствии? –

+1

@R .. Это, наверное, очень плохая идея! Даже с '# undef'. –

ответ

5

«есть в любом случае, чтобы обойти это, или я просто переименовать функцию, чтобы очистить или подобное?»

int(*const delete)(const char* path); 
      // ^^^^^^ 

Да, вы должны переименовать его, если код в вопросе находится под вашим контролем!
Вы просто не можете использовать указатель функции с именем delete в скомпилированном коде на С ++, потому что это зарезервированное ключевое слово для языка.

Вам просто нужно отличать его от ключевого слова. Вместо того, чтобы переименовать его в purge, что может ввести в заблуждение, с семантической точки зрения, вы можете использовать что-то вроде

int(*const delete_)(const char* path); 
       //^

, чтобы получить его отличие от ключевого слова C++.


О комментариях с упоминанием вид Асимметричная/несовместимым именования:
Просто используйте _ суффикса для всех из них. Как давая мнение, это мой предпочтительный стиль для переменных-членов структур или классов в любом случае.

+0

Да, было интересно, есть ли у кого-нибудь волшебные трюки, чтобы обойти его, но не надеялись! Просто хотел «ожидаемое» имя функции, «удалить» файл значительно чаще, чем «очистить» - эй хо! – ZXcvbnM

+0

@ZXcvbnM Вы можете использовать что-то вроде 'delete_', чтобы преодолеть эти проблемы смыслового уровня. –

+0

Как насчет 'unlink'? –

Смежные вопросы