#c #pointers
#c #указатели
Вопрос:
У меня есть функция, подобная:
typedef struct
{
bool x;
bool y;
bool z;
} myStruct;
static void myFunction(const myStruct *pTomystruct_out)
{
if (pTomystruct_out->x == TRUE)
{
/*Do Something*/
}
}
Теперь для некоторых целей отладки я хочу добавить отладочный код, чтобы параметр указателя всегда имел значение TRUE.
Внутри функции перед оператором if я хочу сделать что-то вроде:
pTomystruct_out.x = TRUE /*This is not the correct way*/
Как сделать это правильно?
Спасибо!
Ответ №1:
pTomystruct_out
это указатель, поэтому вам нужно разыменовать его для управления тем, на что указано. Вы можете использовать *
opetator для разыменования:
(*pTomystruct_out).x = TRUE;
Также вы можете использовать ->
оператор, где A->B
означает (*A).B
:
pTomystruct_out->x = TRUE;
Кроме того, этого недостаточно, потому что указатель pTomystruct_out
помечен как const
.
Вы можете использовать приведение к неконстантному указателю, чтобы разрешить его модификации.
((myStruct*)pTomystruct_out)->x = TRUE;
Синтаксически это сбор, но может быть опасно изменять объект, который, как считается, не подлежит изменению. Создание копии объекта и изменение копии безопаснее.
typedef struct
{
bool x;
bool y;
bool z;
} myStruct;
#if 1 /* debug mode */
static void myFunction(const myStruct *pTomystruct_out_arg) /* change argument name */
{
myStruct pTomystruct_debug_temp = *pTomystruct_out_arg; /* make a copy */
myStruct *pTomystruct_out = amp;pTomystruct_debug_temp; /* declare a variable with original argument name */
pTomystruct_out->x = TRUE; /* modify the copy */
#else
static void myFunction(const myStruct *pTomystruct_out)
{
#endif
if (pTomystruct_out->x == TRUE)
{
/*Do Something*/
}
}
Ответ №2:
Как упоминалось в предыдущем ответе, параметр имеет значение const, что отключает внесение изменений в этот параметр. Вы, вероятно, не хотите, чтобы он был const .
Чтобы добавить отладочный код, вы можете использовать макросы. У вас может быть заголовочный файл, содержащий макросы, как показано ниже:
#define DEBUG
Или:
#define DEBUG 1
Включенный заголовок с этим макроком позволяет вам написать свою функцию следующим образом:
static void myFunction(const myStruct *pTomystruct_out)
{
#ifdef DEBUG
pTomystruct_out.x = TRUE
#endif
}
Если вы использовали последний макрос #define DEBUG 1
(который я рекомендую), вы можете использовать if-оператор вместо:
static void myFunction(const myStruct *pTomystruct_out)
{
#if DEBUG
pTomystruct_out.x = TRUE
#endif
}
Я рекомендую использовать #define DEBUG 1
, потому что тогда вам не придется комментировать макрос всякий раз, когда он вам не нужен. Вы можете просто установить для него значение 0.
Если вам не нужен файл заголовка, вы можете использовать -D
флаг с помощью gcc, например gcc <INPUTFILE> -DDEBUG
.