如何在没有警告的情况下处理这些 typedef?
How do I handle these typedef's without warnings?
我有一些 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
?
您应该这样修改这两个代码片段:
在声明文件中:
#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;
}
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;
}
因为您要标记预处理器标志,所以最好让预处理器进行检查:
int functionName(value_type val) {
#if TYPEMODE == 1
val = 5;
#elif TYPEMODE == -1
strcpy(val, "hi");
#endif
return 0;
}
只是提供一个替代选项:您是否考虑过放弃 #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;
}
我有一些 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
?
您应该这样修改这两个代码片段:
在声明文件中:
#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;
}
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;
}
因为您要标记预处理器标志,所以最好让预处理器进行检查:
int functionName(value_type val) {
#if TYPEMODE == 1
val = 5;
#elif TYPEMODE == -1
strcpy(val, "hi");
#endif
return 0;
}
只是提供一个替代选项:您是否考虑过放弃 #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;
}