Я недавно ответил на вопрос о добавлении макросов в C
в Могу ли я добавить к макросу препроцессора?
Как сказано в ответе, следующее работает как в clang, так и в g ++, но не в msvc
#define pushfoo _Pragma("push_macro(\"foo\")") //for convenience
#define popfoo _Pragma("pop_macro(\"foo\")") //I tried __pragma and __Pragma for msvc as well
#define foo 1
pushfoo //push the old value
#undef foo //so you don't get a warning on the next line
#define foo popfoo foo , 2 //append to the previous value of foo
pushfoo
#undef foo
#define foo popfoo foo , 3
pushfoo
#undef foo
#define foo popfoo foo , 4
foo //this whole list will expand to something like popfoo foo popfoo foo popfoo foo , 4
//which will in turn expand to 1 , 2 , 3 , 4
foo //the second time this will expand to just 1
Хотя это, похоже, работает, я хочу знать, может ли это сработать для gcc
и лязг, но msvc также (или только) правильный, или если поведение, которое они демонстрируют, является обязательным поведением
по спецификации языка. Я заинтересован в C и C ++, если они различаются (в основном интересует
новейшие издания, C18 и C ++ 17 на момент написания)