gpt4 book ai didi

c++ - 如何创建公开通用函数的 DLL?

转载 作者:行者123 更新时间:2023-11-27 23:40:17 24 4
gpt4 key购买 nike

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

问题

extern 的正确语法是什么?

最小工作示例

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

最佳答案

编译器必须知道您将哪些类型用于泛型,因为它基本上必须制作一个适用于该类型的 Timer 拷贝。

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

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

关于c++ - 如何创建公开通用函数的 DLL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55662246/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com