===Utiliser les std::initializer_list (crochets) avec des macros=== 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{.., .., ..})''. {{gh>https://github.com/bansan85/wiki_le_garrec_fr/blob/master/cpp/preprocessor/bracket.cpp}} 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. 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