Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+;中使用宏时出错+;验证IP地址的步骤_C++_Macros - Fatal编程技术网

C++ 在C+;中使用宏时出错+;验证IP地址的步骤

C++ 在C+;中使用宏时出错+;验证IP地址的步骤,c++,macros,C++,Macros,我需要使用宏检查我的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)

我需要使用宏检查我的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

我错过了一些东西,但我就是想不起来。如果我写的是as函数,它工作得很好。我很好奇为什么它不能作为宏来工作

如果您真的想将其作为宏来实现,那么您需要从宏内部删除
返回
。不能将宏的“结果”指定给变量,因为它不是一条语句

#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;
}
#包括
#定义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;};
int main()
{
字符ip[16]=“0.0.1.0”;
int x=99;
IPV4_ZEROVAL_检查(ip,x);
printf(“x的值=%d\n”,x);
返回0;
}

将其作为宏实现没有任何好处。将其作为函数保留,如果它足够小,编译器将在发布模式下编译时内联它。

宏在实际编译过程之前通过文本替换工作

示例:

根据这一定义:

#define FOO(bar) {return bar * 2;};
此行的文本替换:

x =  FOO (ipaddr);
编译器会看到以下C代码:

x =  {return ipaddr * 2;};
这是不正确的C代码

  • 你的C教材应该包括这一点
  • 在您的情况下(大多数情况下),最好使用函数而不是宏

如果展开宏,您将看到问题所在:

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;
}
const std::string zero_IP=“0.0.0.0”;
int main()
{
字符ip[16]=“0.0.1.0”;
bool isZero=ip==zero\u ip;

std::为什么不使用常规(内联)函数而使用宏?请不要使用宏。除此之外,ipaddr变量正在丢失该宏应该是一个函数。也要弄清楚为什么它没有做你想要的事情,首先将宏中的代码复制并粘贴到你的
main
函数中。