Существует ли способ подавить искажение имени C++?

Это старый поток, который встречается во многих моих поисках, но в Win7 появился новый планировщик, и, похоже, он ведет себя не так, как описано выше.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            DateTime dtEnd = DateTime.Now.AddSeconds(1.0);
            int i = 0;
            while (DateTime.Now < dtEnd)
            {
                i++;
                Thread.Sleep(1);
            }

            Console.WriteLine(i.ToString());

            i = 0;
            long lStart = DateTime.Now.Ticks;
            while (i++ < 1000)
                Thread.Sleep(1);

            long lTmp = (DateTime.Now.Ticks - lStart) / 10000;

            Console.WriteLine(lTmp.ToString());

            Console.Read();
        }
    }
}

С помощью приведенного выше кода мой первый результат дал 946. Таким образом, за промежуток времени в 1 секунду при использовании сна в 1 мс я получил 946 пробуждений. Это очень близко к 1 мс.

Вторая часть спрашивает, сколько времени требуется, чтобы выполнить 1000 событий сна при 1 мс каждый. Я получил 1034 мс. Опять же, почти 1 мс.

Это было на 1,8 ГГц core2duo + Win7 с использованием .Net 4.0

Редактировать: запомните, сон (x) не означает, что вы просыпаетесь в это время, это значит, разбудите меня не раньше этого время. Это не гарантировано. Хотя вы можете увеличить приоритет потока, и Windows должна запланировать ваш поток до потоков с более низким приоритетом.

5
задан Shog9 23 May 2009 в 21:15
поделиться

3 ответа

"bradtgmurray" правильно, но для компиляторов Visual C ++ вам все равно нужно явно экспортировать свою функцию. Но использование файла .DEF, как предлагает "Serge-appTranslator", - неправильный способ сделать это.

Каков универсальный способ экспорта символов в Visual C ++?

Используя инструкцию declspec (dllexport / dllimport), который работает как для кода C, так и для кода C ++, независимо от того, декорирован он или нет (тогда как .DEF ограничен C, если вы не хотите украсить свой код вручную).

Итак, правильный способ экспорта недекорированных функций в Visual C ++ - это комбинирование идиома экспорта "C", как отвечает "bradtgmurray", и ключевое слово dllimport / dllexport.

Пример?

В качестве примера я создал на Visual C ++ пустой проект DLL и написал две функции, одну назвали CPP, потому что он был украшен, а другой C, потому что это не так. Код следующий:

// Exported header
#ifdef MY_DLL_EXPORTS
#define MY_DLL_API __declspec(dllexport)
#else
#define MY_DLL_API __declspec(dllimport)
#endif

// Decorated function export : ?myCppFunction@@YAHF@Z
MY_DLL_API int myCppFunction(short v) ;

// Undecorated function export : myCFunction
extern "C"
{
MY_DLL_API int myCFunction(short v) ;
} ;

Я думаю, вы уже знаете, но для полноты картины макрос MY_DLL_API должен быть определен в make-файле DLL (т.е. VCPROJ), но не пользователями DLL.

Код C ++ прост написать, но для полноты картины я напишу его ниже:

// Decorated function code
MY_DLL_API int myCppFunction(short v)
{
   return 42 * v ;
}

extern "C"
{

// Undecorated function code
MY_DLL_API int myCFunction(short v)
{
   return 42 * v ;
}

} ;
10
ответ дан 18 December 2019 в 05:16
поделиться

Заключите определения функций в extern "C" {}

extern "C" {
    void foo() {}
}

См. http://www.parashift.com/c++-faq-lite/mixing-c-and- cpp.html

25
ответ дан 18 December 2019 в 05:16
поделиться

Вы можете избежать любых изменений (C ++, cdecl, stdcall, ...) для экспортируемых функций, используя файл .def с разделом EXPORTS. Просто создайте файл MyDll.def и добавьте его в свой проект:

LIBRARY "MyDLL"
EXPORTS
  Foo
  Bar

На самом деле, скорее всего, мастер уже создал для вас файл def. Вам просто нужно заполнить раздел ЭКСПОРТ.

10
ответ дан 18 December 2019 в 05:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: