在C++中使用宏验证 IP 时出错
Error When using a Macro in C++ to validate an IP
我需要使用宏检查我的ipaddr是否等于0.0.0.0。我按如下方式编写了代码,但不断出现错误。
#define IPV4_ZEROVAL_CHECK(ip) {int d1,d2,d3,d4; return (4 == sscanf(ip, "%d.%d.%d.%d", &d1, &d2, &d3, &d4)) ? ((d1 == 0 && d2 == 0 && d3 == 0 && d4 ==0) ? 0 : 1) : 0;};
int main()
{
char ip[16] = "0.0.1.0";
int x = 99;
x= IPV4_ZEROVAL_CHECK (ipaddr);
printf("Value of x=%d n",x);
return 0;
}
编译时出现以下错误
ipbox [root] # gcc test.cpp -lstdc++ -o test.o
test.cpp: In function 'int main()':
test.cpp:9: error: expected primary-expression before '{' token
test.cpp:9: error: expected `;' before '{' token
我错过了一些东西,但只是无法绕过它。如果我写的是函数,它工作得很好。我很好奇为什么它不能作为宏工作
如果你真的想把它实现为一个宏,那么你需要从宏内部删除return
。您不能将宏的"结果"分配给变量,因为它不是单个语句。
#include <cstdio>
#define IPV4_ZEROVAL_CHECK(ip, result) {int d1,d2,d3,d4; result = (4 == sscanf(ip, "%d.%d.%d.%d", &d1, &d2, &d3, &d4)) ? ((d1 == 0 && d2 == 0 && d3 == 0 && d4 ==0) ? 0 : 1) : 0;};
int main()
{
char ip[16] = "0.0.1.0";
int x = 99;
IPV4_ZEROVAL_CHECK (ip, x);
printf("Value of x=%d n",x);
return 0;
}
将其实现为宏没有任何优势。将其保留为函数,如果它足够小,编译器将在发布模式下编译时内联它。
如果展开宏,您将看到问题所在:
int main()
{
char ip[16] = "0.0.1.0";
int x = 99;
x= {int d1,d2,d3,d4; return (4 == sscanf(ip, "%d.%d.%d.%d", &d1, &d2, &d3, &d4)) ? ((d1 == 0 && d2 == 0 && d3 == 0 && d4 ==0) ? 0 : 1) : 0;};
printf("Value of x=%d n",x);
return 0;
}
{int d1,...}
不是表达式,编译器需要表达式和x=
和{
之间的分号。
如果你出于某种原因迫切想要一个宏,你可以写一个更简单的宏:
#define IPV4_ZEROVAL_CHECK(ip) (strcmp(ip, "0.0.0.0") == 0)
但我会推荐这个功能
bool IPV4_ZEROVAL_CHECK(const std::string& ip)
{
return ip == "0.0.0.0";
}
或者 - 最简单的解决方案 - 定义一个比较常量:
const std::string zero_IP = "0.0.0.0";
int main()
{
char ip[16] = "0.0.1.0";
bool isZero = ip == zero_IP;
std::cout << "The value is " << isZero;
}
宏在实际编译过程之前通过文本替换来工作。
例:
鉴于此定义:
#define FOO(bar) {return bar * 2;};
此行的文本替换:
x = FOO (ipaddr);
导致编译器看到以下 C 代码:
x = {return ipaddr * 2;};
这是不正确的 C 代码。
- 你的C教科书应该涵盖这一点
- 在您的情况下(在大多数情况下(,最好使用函数而不是宏。
相关文章:
- 正在尝试了解输入验证循环
- 如何在C++中检查2D数组中负值的输入验证
- LibGit2 SSH身份验证失败
- Vulkan验证层不断在VkQueuePresentKHR()上抛出图像布局错误
- constexpr上下文中std::initializer_list的验证
- 正在验证c++中用户的整数输入
- 我正在开发服务器,ip作为参数传递不起作用
- 加密++验证大文件签名
- 如何使用 Boost Asio 在 Android 上获取我的本地 udp IP 地址?
- C++卡验证问题
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 验证指针链
- 此代码验证公式是什么意思?
- cin 的十进制输入验证?
- 简单的 HTML 验证器
- 为什么 WinInet 在通过 FQDN 连接时无法通过协商自动进行身份验证,但如果通过 IP 连接则成功?
- 在C++中使用宏验证 IP 时出错
- 验证 IP 地址是否已颁发的简单方法
- 验证/识别表示IP地址的字符串的版本
- 在连接(ping)之前验证IP地址(主机)是否存在