• do-while() 模式的宏 出现 语法错误do, 乃至 语法错误if 的问题


    近期定义了一个宏:

    my_macro.h
    #define SHOW_INFO_MACRO() do { }while(0)

    使用时 main.cpp:

    #include ...
    #include "my_macro.h" SHOW_INFO_MACRO();
    int main() { ... // 省略具体代码 return 0; }

    编译 main.cpp 会报错:

    error C2059: 语法错误:“do”
    error C2143: 语法错误 : 缺少“;”(在“{”的前面)
    error C2447: “{”: 缺少函数标题(是否是老式的形式表?)
    error C2059: 语法错误:“while

    其实, 哪怕是 main.cpp

    do 
    {
    } while ();
    
    int main()
    {
        return 0;
    }
    
    
    error C2059: 语法错误:“do”
    error C2143: 语法错误 : 缺少“;”(在“{”的前面)
    error C2447: “{”: 缺少函数标题(是否是老式的形式表?)
    error C2059: 语法错误:“while

    在全局上下文上是不能够使用 do、while、if、else 等语句的, 可能是编译器出于 编译连接的错误防范机制, 从而禁止在 全局上下文上禁止直接操作。

    还是会有一些情况, 是希望在 进入main 函数之前执行的, 例如创建维护 “很全局化”的对象数据:

    #include <stdlib.h>
    #include <iostream>
    
    int g_global_value_1;
    int g_global_value_2;
    int g_global_value_3;
    
    void initialize_globals()
    {
        std::cout <<"func" << std::endl; 
    
        g_global_value_1 = 1;
        g_global_value_2 = 2;
        g_global_value_3 = 3;
    }
    
    initialize_globals();
    
    
    int main()
    {
        std::cout << "main" << std::endl;
        system( "PAUSE");
        return 0;
    }

    是不行的:

    error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
    error C2556: “int initialize_globals(void)”: 重载函数与“void initialize_globals(void)”只是在返回类型上不同,参见“initialize_globals”的声明
    error C2371: “initialize_globals”: 重定义;不同的基类型,参见“initialize_globals”的声明

    但是可以通过 声明定义 全局变量方式实现:

    #include <stdlib.h>
    #include <iostream>
    
    int g_global_value_1;
    int g_global_value_2;
    int g_global_value_3;
    
    void initialize_globals()
    {
        std::cout <<"func" << std::endl; 
    
        g_global_value_1 = 1;
        g_global_value_2 = 2;
        g_global_value_3 = 3;
    }
    
    class GlobalBooster
    {
    public:
        GlobalBooster()
        {
            initialize_globals();
        }
    };
    GlobalBooster gb;
    
    int main()
    {
        std::cout << "main" << std::endl;
        system( "PAUSE");
        return 0;
    }

    在全局上下文中至少有 一下几件事 是允许的:

    //三个全局变量的声明
    int g_global_value_1;
    int g_global_value_2;
    int g_global_value_3;
    
    // 函数的声明和定义
    void initialize_globals()
    
    // 类的声明和定义
    class GlobalBooster
    
    // 全局变量的创建
    GlobalBooster gb;
    
    // main() 函数的声明和定义
    int main()

    但总体来说, 在全局上下文允许的都是 声明、定义、创建数据; 但没有 if/else/while/do 这些“逻辑操作?” 的操作, 至于什么动机, 我还暂时不明白。

  • 相关阅读:
    node.js mongodb笔记
    查询数据库的连接情况
    使用cmd命令查看电脑端口占用情况
    正则表达式基本语法
    ASCII码对照表
    使用命令实现IIS 站点和应用程序池自动启动和停止
    postgresql常见命令及操作
    apigateway-kong(四)负载均衡理论及实现
    apigateway-kong(三)Proxy规则
    apigateway-kong(二)admin-api(结合实例比官网还详细)
  • 原文地址:https://www.cnblogs.com/Wilson-Loo/p/3182562.html
Copyright © 2020-2023  润新知