【问题标题】:How do I handle these typedef's without warnings?如何在没有警告的情况下处理这些 typedef?
【发布时间】:2020-07-21 09:20:05
【问题描述】:

我有一些 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 警告的方法?

【问题讨论】:

  • val = 5 应该实现什么? int 这里应该是int* 吗?

标签: c type-conversion warnings typedef


【解决方案1】:
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;
}

【讨论】:

    【解决方案2】:

    你应该这样修改两个代码片段:

    在声明文件中:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        只是为了提供一个替代选项:您是否考虑过放弃#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;
        }
        

        【讨论】:

          猜你喜欢
          • 2013-03-30
          • 2021-11-22
          • 1970-01-01
          • 2017-10-29
          • 2019-05-14
          • 2011-05-23
          • 1970-01-01
          • 2023-01-07
          相关资源
          最近更新 更多