Outils pour utilisateurs

Outils du site


lang:cpp:preprocesseur

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Prochaine révision
Révision précédente
lang:cpp:preprocesseur [2019/08/27 08:49] – Création avec "Utiliser les std::initializer_list avec des macros" rootlang:cpp:preprocesseur [2022/08/18 10:31] (Version actuelle) – [Désactiver certains warnings pour certains compilateurs] : déplacement côté C root
Ligne 1: Ligne 1:
-===Utiliser les std::initializer_list avec des macros=== 
-Le préprocesseur a du mal avec les ''{}''. Il faut mettre le type explicitement et entourer le tout de parenthèse. 
  
-<code cpp> +===Utiliser les std::initializer_list (crochets) avec des macros=== 
-void f(std::list<std::string>{} +Le préprocesseur, comme le compilateur considère la virgule comme séparateur d'argument. Mais seul le compilateur considère les crochets ''{}'' comme un groupe d'argument. Le préprocesseur va considérer une virgule à l'intérieur d'un groupe de crochets comme un changement d'argument. La solution consiste à définir explicitement le type et à entourer les crochets par des parenthèses : ''(std::list<int>{.., .., ..})''.
-#define F(XXXX) f(XXXX)+
  
-int main() +{{gh>https://github.com/bansan85/wiki_le_garrec_fr/blob/master/cpp/preprocessor/bracket.cpp}}
-{ +
-  std::list<std::string> c; +
-  f(c); +
-  f({"1", "2", "3", "4"}); +
-  F((std::list<std::string>{"1", "2", "3", "4"})); +
-  F(std::list<std::string>({"1", "2", "3", "4"})); +
-} +
-</code>+
  
-[[https://stackoverflow.com/questions/30372148/passing-an-initialization-list-to-a-macro|Passing an initialization list to a macro]] {{ :lang:cpp:preprocesseur:c_-_passing_an_initialization_list_to_a_macro_-_stack_overflow_2019-08-27_08_47_03_.html |Archive du 27/08/2019}}+Rendu : 
 + 
 +{{gh>https://github.com/bansan85/wiki_le_garrec_fr_travis/blob/master/cpp/preprocessor/bracket.cpp.i -13}} 
 + 
 +On voit bien que le préprocesseur respecte les parenthèses mais pas les crochets. 
 + 
 +[[https://stackoverflow.com/questions/30372148/passing-an-initialization-list-to-a-macro|Passing an initialization list to a macro]] {{ :lang:cpp:preprocesseur:c_-_passing_an_initialization_list_to_a_macro_-_stack_overflow_2019-08-27_08_47_03_.html |Archive du 21/05/2015 le 27/08/2019}} 
 + 
 +===Remplacer les #define par #pragma once=== 
 + 
 +On peut lancer le script python suivant. 
 + 
 +Il remplace le premier ''#ifndef/#define'' par ''#pragma once'' et supprimer le dernier ''#endif''
 + 
 +La méthode n'est pas parfaite. Elle peut poser des problèmes sur les fichiers n'ayant pas le mécanisme d'anti inclusion multiple. 
 + 
 +<file python remove_header.py> 
 +import re 
 +from pathlib import Path 
 + 
 +def my_function(fname): 
 +    with open(fname, 'r') as infile: 
 +        lines = infile.readlines() 
 + 
 +    pifn = re.compile('^#ifndef'
 +    pdefinc = re.compile('^#define INCLUDED_.*_H??'
 +    pendif = re.compile('^#endif'
 +    i = len(lines)-2 
 +    for i in range(len(lines)-1): 
 +        if lines[i] == '#pragma once\n': 
 +            return 
 +        if pifn.search(lines[i]) and pdefinc.search(lines[i+1]): 
 +            break 
 +     
 +    if i != len(lines)-2: 
 +        print(i, lines[i]) 
 +        lines[i] = "#pragma once\n" 
 +        del lines[i+1] 
 +     
 +        for i in range(len(lines)-1, -1, -1): 
 +            if pendif.search(lines[i]): 
 +                print(i, lines[i]) 
 +                del lines[i] 
 +                if lines[i-1]=="\n" and len(lines) != i and lines[i]=="\n": 
 +                    del lines[i] 
 +                with open(fname, 'w', newline='\n') as outfile: 
 +                    outfile.write(''.join(lines)) 
 +                break 
 + 
 + 
 +for path in Path('G:\\Github\\libreoffice\\').rglob('*.h*'): 
 +    try: 
 +        my_function(path) 
 +    except UnicodeDecodeError: 
 +        pass 
 +    except PermissionError: 
 +        pass 
 +</file>
lang/cpp/preprocesseur.1566888564.txt.gz · Dernière modification : 2019/08/27 08:49 de root