Rascunho dos Módulos C ++ (Especificação Técnica após C ++ 17)
Um rascunho e várias revisões atualizadas para a especificação do módulo C / C ++ foram publicados por WG21 em open-std.org. Vou criar um link apenas para os documentos mais recentes aqui:
- Rascunho de trabalho, extensões para C ++ para módulos N4610 (outubro de 2016).
- Quarta revisão publicada como P0142R0 (março de 2016).
- Texto para Módulos publicado como P0143R2 (março de 2016).
- A equipe do clang publicou uma segunda revisão de suas alterações: P0273R1 (outubro de 2016).
As seguintes postagens de blog contêm um resumo das reuniões de padrões e, em particular, um resumo do status atual do esboço dos módulos:
Atualização: conforme explicado no relatório de viagem de Kona que vinculei acima, há atualmente duas propostas concorrentes, uma da Microsoft e uma do Clang. A solução proposta da Microsoft não permite exportar Macros, enquanto a solução da equipe do Clang suportaria a exportação de Macros. Até agora, apenas a Microsoft apresentou formalmente um rascunho para a especificação de um módulo.
Especificação do módulo conforme proposta pela Microsoft
Aqui está uma visão geral rápida dos conceitos mais importantes que esta proposta contém. Como é um rascunho, isso ainda pode mudar. O novo padrão de módulos consistirá, entre outras coisas, no seguinte:
Uma module
palavra-chave para declarar um módulo, vários arquivos podem declarar isso para construir um módulo (mas para cada módulo, apenas uma unidade de compilação pode conter uma export {}
seção):
module M;
Uma import
palavra-chave para importar módulos, em vez import
dela, também pode ser decidida em using module
vez disso, então uma nova palavra-chave de importação pode ser evitada.
import std.io;
import module.submodule;
Uma export
sintaxe, que define as declarações públicas que fazem parte deste módulo, declarações de não interface que não devem ser exportadas como parte do módulo, serão definidas fora do bloco de exportação. As declarações podem ser qualquer tipo de declaração em C / C ++, ou seja, não apenas funções, mas também variáveis, estruturas, modelos, namespaces e classes:
export {
int f(int);
double g(double, int);
int foo;
namespace Calc {
int add(int a, int b);
}
}
void not_exported_function(char* foo);
Uma mudança importante nos módulos será que as macros e as definições do pré-processador serão locais para os módulos e não serão exportadas. Assim, as macros não têm nenhum impacto nos módulos importados:
#define FILE "my/file"
import std.io; //will not be impacted by the above definition
É importante notar que o sistema de pré-processador atual e os módulos serão capazes de coexistir e os cabeçalhos ainda podem ser usados, por exemplo, para incluir macros.
Para informações mais detalhadas, sugiro ler o rascunho.
Módulos Clang
O Clang está trabalhando na implementação de módulos que podem ser encontrados na página de módulos do clang . No entanto, o clang atualmente não implementa uma sintaxe concreta para os módulos, ou seja, nenhuma das sintaxes mencionadas acima foi implementada pelo Clang. Para explicar isso, a página contém a seguinte declaração:
No momento, não há sintaxe C ou C ++ para declarações de importação. O Clang acompanhará a proposta de módulos no comitê C ++. Consulte a seção Inclui como importações para ver como os módulos são importados hoje.
A parte principal que é implementada atualmente pelo Clang é a "Linguagem de mapa de módulo", que permite escrever mapas de módulo para código existente que ainda usa arquivos de cabeçalho.
Exportações de macro de módulos
Conforme mencionado acima, ainda não está claro se as macroexportações farão parte dos Módulos TS finais . Em P0273R1 a seguinte sintaxe foi proposta para a exportação de macros:
#export define MAX(A,B) ((A) > (B)) ? (A) : (B);