Я использую gtest и gmock для своих модульных тестов, я имитирую unistd
функции чтения/записи для ввода, отправки и получения тестирования (C-функция Gmock):
class MockSysFuncs {
public:
MOCK_METHOD3(read, ssize_t(int, char*, size_t));
MOCK_METHOD3(write, ssize_t(int, const char*, size_t));
sem_t readSem;
static std::shared_ptr<MockSysFuncs> _mockSysFuncObj;
};
ssize_t read(int __fd, void* __buf, size_t __nbytes);
ssize_t write(int __fd, const void* __buf, size_t __n);
Реализация функций (в mock файле cpp):
ssize_t read(int __fd, void *__buf, size_t __nbytes) {
sem_wait(&MockSysFuncs::_mockSysFuncObj->readSem);
return MockSysFuncs::_mockSysFuncObj->read(__fd, static_cast<char *>(__buf), __nbytes);
}
ssize_t write(int __fd, const void *__buf, size_t __n) {
return MockSysFuncs::_mockSysFuncObj->write(__fd, static_cast<const char *>(__buf), __n);
}
При компиляции я получаю следующие предупреждения:
warning: redundant redeclaration of 'ssize_t read(int, void*, size_t)' in same scope [-Wredundant-decls]
168 | ssize_t read(int __fd, void* __buf, size_t __nbytes);
/usr/include/unistd.h:360:16: note: previous declaration of 'ssize_t read(int, void*, size_t)'
360 | extern ssize_t read (int __fd, void *__buf, size_t __nbytes) __wur;
warning: redundant redeclaration of 'ssize_t write(int, const void*, size_t)' in same scope [-Wredundant-decls]
169 | ssize_t write(int __fd, const void* __buf, size_t __n);
/usr/include/unistd.h:366:16: note: previous declaration of 'ssize_t write(int, const void*, size_t)'
366 | extern ssize_t write (int __fd, const void *__buf, size_t __n) __wur;
Есть ли способ решить эти предупреждения, не снимая флаг компиляции -Wredundant-decls
?
@ Jarod42, Дублирующее объявление находится в unistd.h
Я не могу трогать этот файл, и мне нужно включить его для других целей, кроме чтения/записи.
Удалите те, которые вы добавили после занятий class MockSysFuncs
.
Это макет для функций чтения/записи, если я удалю это объявление, я удалю макет. Вот как я издеваюсь над функциями C с помощью gmock, который является инструментом cpp.
Насколько я понимаю, вы переопределяете C-функции своей собственной версией (которая является UB, но поддерживается некоторыми компиляторами, такими как gcc со слабым символом), но предупреждение касается ваших объявлений в заголовке.
Спасибо @ Jarod42, вы правы, двойное объявление не нужно. Тесты могут добраться до реализации Mock и без этого.
Решение, которое я нашел на данный момент, заключается в использовании #pragma
:
class MockSysFuncs {
public:
MOCK_METHOD3(read, ssize_t(int, char*, size_t));
MOCK_METHOD3(write, ssize_t(int, const char*, size_t));
sem_t readSem;
static std::shared_ptr<MockSysFuncs> _mockSysFuncObj;
};
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wredundant-decls"
ssize_t read(int __fd, void* __buf, size_t __nbytes);
ssize_t write(int __fd, const void* __buf, size_t __n);
#pragma GCC diagnostic pop
В общем, я считаю #pragma
плохой практикой и стараюсь не использовать ее в своем коде, но, поскольку это макет файла для модульных тестов, а не рабочего кода, я думаю, это нормально.
Ваше предупреждение касается избыточных объявлений, поэтому просто удалите их:
#include <unistd.h> // declare read/write
class MockSysFuncs
{
public:
MOCK_METHOD3(read, ssize_t(int, char*, size_t));
MOCK_METHOD3(write, ssize_t(int, const char*, size_t));
sem_t readSem;
static std::shared_ptr<MockSysFuncs> _mockSysFuncObj;
};
Удалить повторяющиеся объявления?