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 [2020/03/06 19:39] – Précision sur l'utilisation des crochets 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 (crochets) avec des macros=== ===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 à entourer les crochets par des parenthèses : ''({.., .., ..})''.+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>{.., .., ..})''.
  
-<code cpp> +{{gh>https://github.com/bansan85/wiki_le_garrec_fr/blob/master/cpp/preprocessor/bracket.cpp}}
-void f(std::list<std::string>) {} +
-#define F(XXXX) f(XXXX)+
  
-int main() +Rendu :
-+
-  std::list<std::string> c; +
-  f(c); +
-  f({"1", "2", "3", "4"}); +
-   +
-  // OK. La parenthèse encadre tout l'argument de la macro. +
-  F((std::list<std::string>{"1", "2", "3", "4"})); +
-//f((std::list<std::string>{"1", "2", "3", "4"}));+
  
-  // OKLa parenthèse encadre les crochets qui sont donc considérés comme un bloc. +{{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"})); +
  
-  // Pas OK +On voit bien que le préprocesseur respecte les parenthèses mais pas les crochets.
-  // F({ "1", "2", "3", "4" }); +
-  // f({ "1");+
  
-  // OK +[[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}}
-  F(("1", "2", "3", "4" })); +
-  f(("1", "2", "3", "4" })); +
  
-  // Pas OK +===Remplacer les #define par #pragma once===
-  // F(std::list<std::string>{ "1", "2", "3", "4" }); +
-  // f(std::list<std::string>{ "1"); +
-+
-</code>+
  
-On voit bien que le préprocesseur respecte les parenthèses mais pas les crochets.+On peut lancer le script python suivant.
  
-[[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}}+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)-
 +    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.1583519948.txt.gz · Dernière modification : 2020/03/06 19:39 de root