我如何在没有警告的情况下处理这些typedef?

我有一些if语句以不同的方式处理value_type。如果定义了INT,则value_type是一个整数,但是如果定义了CHAR,则value_type是一个字符串。我该如何处理,以免收到任何错误或警告? 我这样定义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给我任何警告?

评论
  • lquia
    lquia 回复
    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;
    }
    
  • d小调
    d小调 回复

    因为您要标记预处理器标志,所以最好让预处理器进行检查:

    int functionName(value_type val) {
    #if TYPEMODE == 1
        val = 5;
    #elif TYPEMODE == -1
        strcpy(val, "hi");
    #endif
       return 0;
    }
    
  • 最后的最后
    最后的最后 回复

    您应该以这种方式修改两个代码片段:

    在声明文件中:

    #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;
    }