Le code suivant, si prétraité avec gcc -E
, produit des erreurs de _Pragma("GCC error")
:Erreur GCC _Pragma se déclenche s'il apparaît dans une étape de prétraitement intermédiaire?
_Pragma("GCC error \"ERROR\"") // error
#define MACRO_ERROR _Pragma("GCC error \"MACRO_ERROR\"")
MACRO_ERROR // error
#define VOID(arg)
VOID(_Pragma("GCC error \"VOID_ERROR\"")) // no error
#define MACRO_VOID_ERROR VOID(_Pragma("GCC error \"MACRO_VOID_ERROR\""))
MACRO_VOID_ERROR // no error
#define FORWARD(macro, arg) macro(arg)
FORWARD(VOID, _Pragma("GCC error \"FORWARD_VOID_ERROR\"")) // error
#define MACRO_FORWARD_VOID_ERROR FORWARD(VOID, _Pragma("GCC error \"MACRO_FORWARD_VOID_ERROR\""))
MACRO_FORWARD_VOID_ERROR // error
FORWARD(VOID, _Pragma("GCC error \"FORWARD_VOID_ERROR\""))
et MACRO_FORWARD_VOID_ERROR
erreurs produisent même si l'opérateur de pragma est pas dans l'expansion finale (qui est vide).
Est-ce que ce comportement est attendu? Par comparaison, VOID(_Pragma("GCC error \"VOID_ERROR\""))
et MACRO_VOID_ERROR
ne produisent pas d'erreurs. Il semble que c'est parce que l'opérateur pragma est "prétraité assez vite" avec ceux-ci.
Quelle est la règle derrière cela?
Auparavant, je supposais que l'opérateur pragma est sans effet s'il apparaît uniquement dans les étapes d'expansion intermédiaires. Évidemment, c'est faux, au moins pour mon gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4)
.
sortie de gcc -E
(lignes vides enlevées):
# 1 "<stdin>"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "<stdin>"
# 1 "<stdin>"
<stdin>:1:11: error: ERROR
# 1 "<stdin>"
# 4 "<stdin>"
<stdin>:4:11: error: MACRO_ERROR
# 4 "<stdin>"
# 13 "<stdin>"
<stdin>:13:11: error: FORWARD_VOID_ERROR
# 13 "<stdin>"
# 16 "<stdin>"
<stdin>:16:11: error: MACRO_FORWARD_VOID_ERROR
# 16 "<stdin>"