Я подозреваю, что знаю ответ на это уже, но мне любопытно, есть ли у каких-либо экспертов какие-либо трюки.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));
}
Вы не можете использовать зарезервированные слова C++ в качестве идентификаторов кода C, если вы собираетесь их комбинировать с компилятором C++. –
Почему бы просто «#define удалить» что-то еще, прежде чем включать заголовок и '#undef delete' впоследствии? –
@R .. Это, наверное, очень плохая идея! Даже с '# undef'. –