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

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
lang:cpp:preprocesseur [2019/10/17 17:03] – Détail de l'archive 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; +Rendu 
-  f(c); + 
-  f({"1", "2", "3", "4"}); +{{gh>https://github.com/bansan85/wiki_le_garrec_fr_travis/blob/master/cpp/preprocessor/bracket.cpp.i -13}} 
-  F((std::list<std::string>{"1", "2", "3", "4"})); + 
-  F(std::list<std::string>({"1", "2", "3", "4"})); +On voit bien que le préprocesseur respecte les parenthèses mais pas les crochets.
-+
-</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 21/05/2015 le 27/08/2019}} [[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.1571324606.txt.gz · Dernière modification : 2019/10/17 17:03 de root