zoukankan      html  css  js  c++  java
  • 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 这些“逻辑操作?” 的操作, 至于什么动机, 我还暂时不明白。

  • 相关阅读:
    Centos7:mariadb替换mysql
    CentOS5 部署 戴尔OMSA
    《Zero MQ》
    可扩展的Web架构和分布式系统
    队列实现
    超级好用的正则表达式网站
    <转>undefined与null的区别
    JS事件
    sublime text 3 快捷键
    设置className的方式(不使用setAttribute)
  • 原文地址:https://www.cnblogs.com/Wilson-Loo/p/3182562.html
Copyright © 2011-2022 走看看