zoukankan      html  css  js  c++  java
  • 重复定义

    为了避免在项目中重复定义,一定要遵守“头文件中声明,源文件中定义、实现”,在需要的地方进行extern声明。

    比如在一个头文件中声明了一个数组,源文件中使用了这个数组,在main文件中也使用了这个数组,那么这个数组放在头文件中将会在link中出现重复定义。

    解决的方法就是在源文件中进行数组的定义,在main文件中进行extern声明。

    头文件

    #pragma once
    #include <cmath>
    #include <cstring>
    #include <assert.h>
    
    typedef double(* PtrFun)(double);
    const int maxIdFun = 16;
    class FunctionEntry
    {
    public:
        PtrFun pFun;
        char *strFun;
    };
    
    
    class SymbolTable;
    
    class FunctionTable
    {
    private:
        PtrFun _pFun[maxIdFun];
        int _size;
    public:
        FunctionTable(SymbolTable & symTab, FunctionEntry funArr[]);
        ~FunctionTable(void);
        int Size()const{return _size;}
        PtrFun GetFun(int id)const
        {
            return _pFun[id];
        }
    };
    View Code

    源文件

    #include "FunctionTable.h"
    #include "SymbolTable.h"
    
    FunctionEntry funArr[maxIdFun] = 
    {
        log, "log",
        log10, "log10",
        exp, "exp",
        sqrt, "sqrt",
        sin, "sin",
        cos, "cos",
        tan, "tan",
        atan, "atan",
        sinh, "sinh",
        cosh, "cosh",
        tanh, "tanh",
        asin, "asin",
        acos, "acos",
        atan, "atan",
        0, ""
    };
    
    FunctionTable::FunctionTable(SymbolTable & symTab, FunctionEntry funArr[]) : _size(0)
    {
        for(int i = 0; i<maxIdFun; i++)
        {
            int len = strlen(funArr[i].strFun);
            if(len == 0)
                break;
            _pFun[i] = funArr[i].pFun;
            int j = symTab.ForceAdd(funArr[i].strFun,len);
            assert(i == j);
            ++_size;
        }
    }
    
    FunctionTable::~FunctionTable(void)
    {
    }
    View Code

    main文件

    #include <windows.h>
    #include <iostream>
    #include "Scanner.h"
    #include "SymbolTable.h"
    #include "Parser.h"
    #include "FunctionTable.h"
    
    extern Status;
    const int maxBuf = 100;
    extern FunctionEntry funArr[];
    
    int main()
    {
        char buf[maxBuf];
        Status status;
        SymbolTable symTab(100);
        FunctionTable funTab(symTab, funArr);
    
        std::cout<<symTab.GetString(10)<<std::endl;
        system("pause");
        return 0;
    }
    View Code

    数组funArr放在头文件中将会发生link错误

  • 相关阅读:
    SQLdiag-配置文件-ProfilerCollector
    SQLdiag-配置文件-PerfmonCollector
    SQLdiag-初识
    Trace-跟踪高消耗的语句需添加哪些事件
    RML Utilities for SQL Server
    【译】第十五篇 Integration Services:SSIS参数
    修改数据文件和日志文件路径
    Trace-导出已有的服务器端跟踪
    iphoneX的适配问题
    添加阿里巴巴图标,让你页面小图标都是CSS3写成
  • 原文地址:https://www.cnblogs.com/7ants/p/3081201.html
Copyright © 2011-2022 走看看