Как мне справиться с этим typedef без предупреждений? - PullRequest
2 голосов
/ 08 апреля 2020

У меня есть некоторые операторы if для обработки value_type различными способами. Если определено INT, то value_type является целым числом, но если определено CHAR, value_typ e является строкой. Как я могу справиться с этим, чтобы я не получал никаких ошибок или предупреждений?

Я определил value_type следующим образом:

#ifdef INT
typedef int value_type;
#define TYPEMODE 1
#endif

#ifdef CHAR
typedef char value_type[80];
#define TYPEMODE -1
#endif

Я обработал это следующим образом в функциях:

int functionName(value_type val) {
   if (TYPEMODE == 1) {
      val = 5;
   }
   if (TYPEMODE == -1) {
      strcpy(val, "hi");
   }
   return 0;
}

Если я определяю INT, это дает мне предупреждение для strcpy, если я определяю CHAR, это дает мне предупреждение для val = 5.

Есть ли лучший способ справиться это, что не даст мне никаких предупреждений с gcc -Wall file.c -o file?

Ответы [ 4 ]

4 голосов
/ 08 апреля 2020
int functionName(value_type val) {
   if (TYPEMODE == 1) {
      val = 5;
   }
   if (TYPEMODE == -1) {
      strcpy(val, "hi");
   }
   return 0;
}

может быть

int functionName(value_type val) {
#if TYPEMODE == 1
      val = 5;
#endif
#if TYPEMODE == -1
      strcpy(val, "hi");
#endif
   return 0;
}
3 голосов
/ 08 апреля 2020

Вы должны изменить оба фрагмента кода следующим образом:

В файле декларации:

#ifdef INT
typedef int value_type;
#define TYPEMODE  1
#endif

#ifdef CHAR
typedef char value_type[80];
#define TYPEMODE  (-1)   // use parentheses to avoid operator precedence issues
#endif

В коде:

int functionName(value_type val) {
#if TYPEMODE == 1
   val = 5;
#elif TYPEMODE == -1
   strcpy(val, "hi");
#endif
   return 0;
}
2 голосов
/ 08 апреля 2020

Поскольку вы помечаете флаги препроцессора, лучше позволить препроцессору выполнить проверку:

int functionName(value_type val) {
#if TYPEMODE == 1
    val = 5;
#elif TYPEMODE == -1
    strcpy(val, "hi");
#endif
   return 0;
}
0 голосов
/ 09 апреля 2020

Просто чтобы предложить альтернативный вариант: вы рассматривали возможность отказа от #defines и использования union?

#include <stdio.h>

typedef union {
    int number;
    char text[50];
} value_type;

void functionName(value_type val, int typemode) {
    if (typemode == 1) {
        val.number = 5;
    } else if (typemode == -1) {
        strcpy(val.text, "hi");
    }
    return 0;
}

int main(void) {
    value_type myval;
    functionName(myval, 1);
    functionName(myval, -1);
    return 0;
}
...