c - C. 二进制 * 的无效操作数(有 'char *' 和 'int')
问题描述
嗨!我在 C 中学习#define。我的程序是关于绝对值的。我有 2 个文件:ft_abs.h:
#ifndef FT_ABS_H
# define FT_ABS_H
# define ABS(Value) ((Value < 0) ? (Value * (-1)) : (Value))
#endif
和 main.c:
#include "ft_abs.h"
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
printf("%s", ABS(argv[1]));
return (0);
}
编译
gcc -o abs ft_abs.h main.c
和...
在 main.c:2:0 中包含的文件中:main.c:在函数'main'中:ft_abs.h:16:41:错误:二进制*的无效操作数(有'char *'和'int')#define ABS(Value) ((Value < 0) ? (Value * (-1)) : (Value)) main.c:17:18: 注意:在宏 'ABS' printf("%s", ABS( argv[1]));
当我将 (Value * (-1)) 更改为 (-Value) 时,它也不起作用(一元减号的类型参数错误)。如果我将 (-Value) 更改为 (Value) 一切正常,但这是无稽之谈。我应该如何更改代码以使其工作(当然使用定义)?
解决方案
argv[1]
是类型char *
。计算绝对值没有任何意义。您可能希望将参数转换为int
类型,然后计算绝对值。
printf("%d", ABS(strtol(argv[1], NULL, 10)));
此外,在编写宏时,您应该始终在参数周围加上括号。
#define ABS(Value) (((Value) < 0) ? ((Value) * (-1)) : (Value))
推荐阅读
- sql - SQL获取一列中具有相同id但不同值的所有行
- stellar.js - 如何务实地将流明发送到未初始化的恒星地址
- c# - 无法使用 c sharp 创建基于事件的任务计划程序
- c++ - 无法打开栅格数据集
- javascript - 如何使用 javascript axios 转换此 curl 请求
- html - 尝试使用 CSS 实现响应式盒装结构
- reactjs - 如何使用redux connect将类型传递给功能组件
- c# - 如何将文本框的值与文本文件中存储的值匹配
- c# - 在 Jenkins 中使用 FTP 上传文件时,某些文件会损坏
- python - 改变乌龟 1 的位置会改变乌龟 2 的位置