如何创建一个公开通用功能的DLL?

时间:2019-04-13 05:12:02

标签: c++

我想公开通用Timer。问题是我不知道为什么extern带有红色下划线,并且Visual Studio 2019社区说“不允许链接规范”。

问题

extern的正确语法是什么?

最小工作示例

标题utilities.hpp

#pragma once

#ifdef UTILITIES_EXPORTS
#define UTILITIES_API __declspec(dllexport)
#else
#define UTILITIES_API __declspec(dllimport)
#endif

namespace Utilities
{   
    template<typename F>
    extern "C" UTILITIES_API void Timer(F f, unsigned int N = 1);
}

定义文件utilities.cpp

#include "Timer.h"
#include <iostream>
#include <vector>
#include <chrono>
#include <iomanip>
using namespace std;

namespace Utilities 
{
    template<typename F>
    void Timer(F f, unsigned int N)
    {
        cout << fixed << setprecision(9);
        vector<unsigned int> results;
        const double million = 1'000'000'000.0;

        for (unsigned int i = 0; i < N; i++)
        {
            chrono::steady_clock::time_point begin = chrono::steady_clock::now();
            f();
            chrono::steady_clock::time_point end = chrono::steady_clock::now();

            unsigned int interval = chrono::duration_cast<chrono::nanoseconds>(end - begin).count();
            results.push_back(interval);
            double elapsedTime = interval / million;
            cout << "Elapsed: \t\t" << elapsedTime << " s." << endl;
        }

        unsigned long long sum = 0;
        for (unsigned int x : results)
            sum += x;
        double totalElapsedTime = sum / million / results.size();
        cout << "\t\t\tAverage elapsed: " << totalElapsedTime << " s." << endl;
    }
}

1 个答案:

答案 0 :(得分:3)

编译器必须知道与泛型一起使用的类型,因为它基本上必须制作一个与该类型兼容的Timer副本。

对于extern方法,没有办法知道这一点,并且必须在运行时对其进行评估,而泛型不是这样工作的。这是一个编译器功能。

您可以为特定类型制作包装,并制作外部包装。