【问题标题】:Error When using a Macro in C++ to validate an IP在 C++ 中使用宏验证 IP 时出错
【发布时间】:2018-08-23 13:29:34
【问题描述】:

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

我错过了一些东西,但就是无法解决它。如果我写的是函数,它运行良好。我很好奇为什么它不能作为 MACRO 工作

【问题讨论】:

  • 为什么使用 MACRO 而不是常规(内联)函数?
  • 请不要为此使用宏
  • 除了已经说过的内容之外,缺少 ipaddr 变量
  • 那个宏应该是一个函数。太理清为什么它没有做你想做的事,首先将宏中的代码复制并粘贴到你的main函数中。

标签: c++ macros


【解决方案1】:

如果你真的想把它作为一个宏来实现,那么你需要从宏内部删除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;
}

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

【讨论】:

    【解决方案2】:

    如果你展开宏,你会看到问题是什么:

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

    【讨论】:

      【解决方案3】:

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

      示例:

      鉴于此定义:

      #define FOO(bar) {return bar * 2;};
      

      该行的文本替换:

      x =  FOO (ipaddr);
      

      导致编译器看到以下 C 代码:

      x =  {return ipaddr * 2;};
      

      这是不正确的 C 代码。

      • 你的 C 教科书应该涵盖这个
      • 在您的情况下(大多数情况下)最好使用函数而不是宏。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-05
        • 2021-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-11
        相关资源
        最近更新 更多