AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / user-480982

Thomas Weller's questions

Martin Hope
Thomas Weller
Asked: 2025-02-28 04:29:07 +0800 CST

Exemplo de clang-format obtendo posicionamento incorreto do qualificador

  • 7

Clang-format diz sobre QualifierAlignment :

Aviso

Definir QualifierAlignmentalgo diferente de Leave, PODERIA levar a uma formatação incorreta do código devido a decisões incorretas tomadas devido à falta de informações semânticas completas do clang-formats. Como tal, deve-se tomar cuidado extra ao revisar as alterações do código feitas pelo uso desta opção.

Gostaria de ver um código de exemplo de quando isso acontece, para que eu saiba melhor o que devo procurar em revisões de código. Tentei várias opções diferentes, de variáveis ​​sobre parâmetros a funções de membro const e modelos - clang-format acertou em todas elas.

c++
  • 1 respostas
  • 47 Views
Martin Hope
Thomas Weller
Asked: 2025-01-08 22:39:02 +0800 CST

O "armazenamento automático" agora inclui registradores?

  • 5

Em duração do armazenamento , li que o armazenamento de registro foi descontinuado por um longo tempo (desde o C++98) e foi removido com o C++17.

Ainda assim, o compilador ainda pode colocar variáveis ​​em um registrador. Eu assumo que ele fará isso como parte da duração de armazenamento automático :

Duração do armazenamento automático

As seguintes variáveis ​​têm duração de armazenamento automática:

Variáveis ​​que pertencem a um escopo de bloco e não são explicitamente declaradas como static, thread_local, (desde C++11) ou extern. O armazenamento para tais variáveis ​​dura até que o bloco no qual elas são criadas saia. Variáveis ​​que pertencem a um escopo de parâmetro (ou seja, parâmetros de função). O armazenamento para um parâmetro de função dura até imediatamente após sua destruição.

Para mim, parece que essa descrição é satisfeita para ambas, variáveis ​​na pilha e variáveis ​​em registradores, dado um aplicativo Windows Desktop e MSVC. Isso está correto?

Só quero usar o termo correto quando falo com meus colegas e estou explicitamente procurando por algo que possa significar "pilha ou registro".

c++
  • 2 respostas
  • 127 Views
Martin Hope
Thomas Weller
Asked: 2025-01-02 23:23:20 +0800 CST

Onde definir a opção /LD ao usar o compilador MSVC?

  • 5

Estou tentando entender a opção "Biblioteca de Tempo de Execução" do Microsoft Visual Studio C++.

De acordo com /MD, /MT, /LD (Use Run-Time Library) [MS Learn] , há 6 opções. Essas são essencialmente 3 opções que vêm em Debug e Release flavor.

Onde defino a opção /LD?

O site diz:

  1. Abra a caixa de diálogo Property Pages do projeto. Para obter detalhes, consulte Definir propriedades de compilação e compilação do C++ no Visual Studio.
  2. Selecione a página de propriedades Propriedades de configuração > C/C++ > Geração de código.
  3. Modifique a propriedade Biblioteca de Tempo de Execução.

Nesse lugar, meu Visual Studio só oferece /MD, /MT, /MDd e /MTd. Não há opção /LD ou /LDd disponível.

Desta declaração em /LD:

Implica /MT, a menos que você especifique explicitamente /MD.

Concluo que essas devem ser opções diferentes, caso contrário eu não poderia especificar /LD e /MD ao mesmo tempo.

Estou usando o Visual Studio 2022 Preview, versão 17.13.0 Preview 2.1. Meu tipo de projeto é uma "Biblioteca de vínculo dinâmico (DLL)". Propriedades de configuração / Geral / Tipo de configuração diz "Biblioteca dinâmica (.dll)".

Tipo de projeto DLL

Estes são todos os argumentos da linha de comando do compilador se eu especificar /MT para a configuração de depuração:

/JMC /permissive- /Yu"pch.h" /ifcOutput "x64\Debug\" /GS /W3 /Zc:wchar_t 
/ZI /Gm- /Od /sdl /Fd"x64\Debug\vc143.pdb" /Zc:inline /fp:precise 
/D "_DEBUG" /D "DYNAMICLIBRARY_EXPORTS" /D "_WINDOWS" /D "_USRDLL" /D "_WINDLL" 
/D "_UNICODE" /D "UNICODE" 
/errorReport:prompt /WX- /Zc:forScope /RTC1 /Gd /MT /FC /Fa"x64\Debug\" /EHsc 
/nologo /Fo"x64\Debug\" /Fp"x64\Debug\DynamicLibrary.pch" /diagnostics:column 

Por quê? Este exemplo [MSDN] diz que eu deveria compilar usando cl /EHsc /W4 /MD /LD test1Dll.cpp. Eu sei, eu poderia fazer isso na linha de comando ou adicionar /LDas opções de linha de comando adicionais da IU. Mas eu quero entender melhor e não apenas seguir algumas instruções às cegas.

c++
  • 2 respostas
  • 132 Views
Martin Hope
Thomas Weller
Asked: 2024-12-13 04:38:01 +0800 CST

Que tipo de UB eu tenho aqui, excluindo a matriz do operador new[]?

  • 6

Dado o seguinte código envolvendo operator new[]e as várias versões erradas de delete:

#include <iostream>

class Test {
public:
    Test()  { std::cout << "Test()\n";  }
    ~Test() { std::cout << "~Test()\n"; }
};

int main()
{
    void* p = operator new[](10 * sizeof(Test));
    Test* test = new (p) Test();
    test->~Test();
    // delete p; // UB1
    // delete[] p; // UB2
    // delete[] test; // UB3
    // operator delete[](test); // UB4?
    operator delete[](p);
    std::cout << "End\n";
}

ao vivo em https://godbolt.org/z/zG3nfzsv6

Você poderia explicar por que UB2 a UB4 são comportamentos indefinidos, com alguma explicação em termos leigos do padrão C++20 rascunho N4861, §7.6.2.8 [expr.delete] e talvez §7.6.2.7 [expr.new]?

Aqui está minha tentativa. Estou bem confiante sobre UB1, mas não muito confiante sobre UB2 e UB3, e menos ainda sobre UB4.

UB1

(ênfase minha)

§ 7.6.2.8 (1)

excluir-expressão:
::optar excluir expressão-cast
::optar excluir [ ] expressão-cast

A primeira alternativa é uma expressão de exclusão de objeto único , e a segunda é uma expressão de exclusão de matriz.

§ 7.6.2.8 (2)

Em uma expressão delete de objeto único , o valor do operando de delete pode ser um valor de ponteiro nulo, um ponteiro para um objeto não array criado por uma new-expression anterior ou um ponteiro para um subobjeto (6.7.2) representando uma classe base de tal objeto (11.7). Caso contrário, o comportamento é indefinido.

Então, para deletesem []eu não devo usar um ponteiro de array. Mas eu usei, então eu tenho UB. Ótimo.

UB2 para UB4

(ênfase minha)

Em uma expressão de exclusão de matriz , o valor do operando de exclusão pode ser um valor de ponteiro nulo ou um valor de ponteiro que resultou de uma nova expressão de matriz anterior . 74 Caso contrário, o comportamento será indefinido.

Bem, eu tenho uma matriz de uma nova expressão anterior.

[Nota: Isso significa que a sintaxe da expressão delete deve corresponder ao tipo do objeto alocado por new, não à sintaxe da nova expressão . — nota final]

Pergunta paralela: Por que isso significa isso?

Ok, então eu tenho operator new[]e esta nota me diz que a sintaxe do meu delete pode ser diferente. Eu não preciso necessariamente, operator delete[]mas algo que corresponda ao tipo do objeto.

Pergunta lateral: Qual é o tipo do meu objeto? Meu ponteiro p é void*, mas voidnão é um tipo de objeto. p aponta para a void[]e void[]é um tipo de objeto?

§ 7.6.2.8 (11)

Para uma expressão de exclusão de array, o objeto excluído é o objeto array. Quando uma expressão de exclusão é executada, a função de desalocação selecionada deve ser chamada com o endereço do objeto excluído em uma expressão de exclusão de objeto único, ou o endereço do objeto excluído adequadamente ajustado para a sobrecarga de alocação de array (7.6.2.7) em uma expressão de exclusão de array, como seu primeiro argumento.

Desculpe, não entendo nada disso. Só tenho um pressentimento de que isso pode ser relevante.

c++
  • 1 respostas
  • 90 Views
Martin Hope
Thomas Weller
Asked: 2024-07-15 22:02:31 +0800 CST

Renderizando a área de transferência repetidamente

  • 5

Tenho um aplicativo que usa renderização atrasada da área de transferência para colar a hora atual. Mas: quando a hora for renderizada uma vez, sempre irá colar a mesma hora, e não a hora atualizada.

Acho que precisaria ligar SetClipboardData(CF_TEXT, nullptr);novamente, para restaurar outro caso de renderização atrasada, mas não sei quando ou onde devo fazer isso. Posso detectar quando o aplicativo de destino retirou os dados da área de transferência?

Como posso colar a hora atual cada vez que o usuário pressiona Ctrl+V?

#include <windows.h>
#include <thread>
#include <chrono>
#include <ctime>
#include <iomanip>
#include <sstream>

// Get current time with milliseconds (HH:MM:SS.xxx)
void GetTime(std::string& time_str)
{
    auto now = std::chrono::system_clock::now();
    auto in_time_t = std::chrono::system_clock::to_time_t(now);
    auto milliseconds = std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()) % 1000;
    std::tm bt{};
    localtime_s(&bt, &in_time_t);
    std::ostringstream oss;
    oss << std::put_time(&bt, "%H:%M:%S") << '.' << std::setfill('0') << std::setw(3) << milliseconds.count();
    time_str = oss.str();
}

void RenderClipboardData(HWND hwnd) {
    std::string time_str;
    GetTime(time_str);

    EmptyClipboard();

    // Allocate global memory for the clipboard data
    HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, time_str.size() + 1);
    if (hGlobal) {
        // Lock the global memory and copy the string into it
        void* pGlobal = GlobalLock(hGlobal);
        if (pGlobal) {
            memcpy(pGlobal, time_str.c_str(), time_str.size() + 1);
            GlobalUnlock(hGlobal);
            SetClipboardData(CF_TEXT, hGlobal);
        }
        else
        {
            // Free the global memory if it wasn't successfully set
            GlobalFree(hGlobal); 
        }
    }
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {

    switch (uMsg) {
    case WM_RENDERFORMAT:
        if (wParam == CF_TEXT) {
            RenderClipboardData(hwnd);
        }
        break;
    case WM_CREATE:
         CreateWindow(
            L"STATIC",
            L"This application pastes the current time on Ctrl+V. ",
            WS_VISIBLE | WS_CHILD,
            10, 10, 600, 100,
            hwnd,
            nullptr,
            reinterpret_cast<LPCREATESTRUCT>(lParam)->hInstance,
            nullptr);

        if (OpenClipboard(hwnd)) {
            EmptyClipboard();
            SetClipboardData(CF_TEXT, nullptr); // Delayed rendering to get the current time
            CloseClipboard();
        }
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
    return 0;
}

int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow) {

    constexpr wchar_t CLASS_NAME[] = L"SampleWindowClass";

    WNDCLASS wc = {};
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = CLASS_NAME;

    RegisterClass(&wc);

    HWND hwnd = CreateWindowEx(
        0,                              // Optional window styles.
        CLASS_NAME,                     // Window class
        L"Delayed Clipboard Rendering", // Window text
        WS_OVERLAPPEDWINDOW,            // Window style

        // Size and position
        CW_USEDEFAULT, CW_USEDEFAULT, 640, 120,

        nullptr,       // Parent window    
        nullptr,       // Menu
        hInstance,     // Instance handle
        nullptr        // Additional application data
    );

    if (hwnd == nullptr) {
        return 0;
    }

    ShowWindow(hwnd, nCmdShow);

    MSG msg = {};
    while (GetMessage(&msg, nullptr, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return 0;
}

Eu tentei:

  • processar a WM_DESTROYCLIPBOARDmensagem e redefinir a área de transferência para renderização atrasada.
c++
  • 1 respostas
  • 50 Views
Martin Hope
Thomas Weller
Asked: 2024-03-14 22:32:49 +0800 CST

O que significa 'tem um SUC'?

  • 5

Eu estava lendo algum código .NET e encontrei o seguinte em DispatcherSynchronizationContext

/// 
///     Wait for a set of handles.
/// 
///  
///     Critical - Calls WaitForMultipleObjectsEx which has a SUC.
///  
[SecurityCritical] 
[SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.ControlPolicy|SecurityPermissionFlag.ControlEvidence)]
public override int Wait(IntPtr[] waitHandles, bool waitAll, int millisecondsTimeout) 
{
    if(_dispatcher._disableProcessingCount > 0)
    {
        // Call into native code directly in order to avoid the default 
        // CLR locking behavior which pumps messages under contention.
        // Even though they try to pump only the COM messages, any 
        // messages that have been SENT to the window are also 
        // dispatched.  This can lead to unpredictable reentrancy.
        return MS.Win32.UnsafeNativeMethods.WaitForMultipleObjectsEx(waitHandles.Length, waitHandles, waitAll, millisecondsTimeout, false); 
    }
    else
    {
        return SynchronizationContext.WaitHelper(waitHandles, waitAll, millisecondsTimeout); 
    }
} 

O que significa "tem um SUC"?

.net
  • 1 respostas
  • 17 Views

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve