Include SkTHash.h causing compiler errors with msvc 2019

63 views
Skip to first unread message

liang jian

unread,
Dec 24, 2022, 5:08:10 AM12/24/22
to skia-discuss
    I build skia m110 with msvc 2019 x64, In a very simple program I want to include SkTHash.h private header files in a .cpp file like this:
#include <include/private/SkTHash.h>
    That causing many compiler errors:

E:\skia\skia\include/private/SkTHash.h(162): warning C4003: not enough arguments for function-like macro invocation 'Q_FOREACH'
E:\skia\skia\include/private/SkTHash.h(172): warning C4003: not enough arguments for function-like macro invocation 'Q_FOREACH'
E:\skia\skia\include/private/SkTHash.h(162): error C2988: unrecognizable template declaration/definition
E:\skia\skia\include/private/SkTHash.h(415): note: see reference to class template instantiation 'SkTHashTable<T,K,Traits>' being compiled
E:\skia\skia\include/private/SkTHash.h(162): error C2059: syntax error: 'for'
E:\skia\skia\include/private/SkTHash.h(162): error C2143: syntax error: missing ')' before ';'
E:\skia\skia\include/private/SkTHash.h(162): error C2238: unexpected token(s) preceding ';'
E:\skia\skia\include/private/SkTHash.h(162): error C3927: '->': trailing return type is not allowed after a non-function declarator
E:\skia\skia\include/private/SkTHash.h(162): error C3484: syntax error: expected '->' before the return type
E:\skia\skia\include/private/SkTHash.h(162): error C3613: missing return type after '->' ('int' assumed)
E:\skia\skia\include/private/SkTHash.h(162): error C3646: 'control': unknown override specifier
E:\skia\skia\include/private/SkTHash.h(162): error C2143: syntax error: missing ';' before '&&'
E:\skia\skia\include/private/SkTHash.h(162): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
E:\skia\skia\include/private/SkTHash.h(162): error C2238: unexpected token(s) preceding ';'
E:\skia\skia\include/private/SkTHash.h(162): error C2059: syntax error: '++'
E:\skia\skia\include/private/SkTHash.h(162): error C2059: syntax error: ')'
E:\skia\skia\include/private/SkTHash.h(162): error C2143: syntax error: missing ')' before ';'
E:\skia\skia\include/private/SkTHash.h(162): error C2238: unexpected token(s) preceding ';'
E:\skia\skia\include/private/SkTHash.h(162): error C3927: '->': trailing return type is not allowed after a non-function declarator
E:\skia\skia\include/private/SkTHash.h(162): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
E:\skia\skia\include/private/SkTHash.h(162): error C3927: '->': trailing return type is not allowed after a non-function declarator
E:\skia\skia\include/private/SkTHash.h(162): error C2059: syntax error: '='
E:\skia\skia\include/private/SkTHash.h(162): error C2059: syntax error: ')'
E:\skia\skia\include/private/SkTHash.h(162): error C2334: unexpected token(s) preceding '{'; skipping apparent function body
E:\skia\skia\include/private/SkTHash.h(172): error C2988: unrecognizable template declaration/definition
E:\skia\skia\include/private/SkTHash.h(172): error C2059: syntax error: 'for'
E:\skia\skia\include/private/SkTHash.h(172): error C2143: syntax error: missing ')' before ';'
E:\skia\skia\include/private/SkTHash.h(172): error C2238: unexpected token(s) preceding ';'
E:\skia\skia\include/private/SkTHash.h(172): error C3927: '->': trailing return type is not allowed after a non-function declarator
E:\skia\skia\include/private/SkTHash.h(172): error C3484: syntax error: expected '->' before the return type
E:\skia\skia\include/private/SkTHash.h(172): error C3613: missing return type after '->' ('int' assumed)
E:\skia\skia\include/private/SkTHash.h(172): error C3646: 'control': unknown override specifier
E:\skia\skia\include/private/SkTHash.h(172): error C2143: syntax error: missing ';' before '&&'
E:\skia\skia\include/private/SkTHash.h(172): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
E:\skia\skia\include/private/SkTHash.h(172): error C2238: unexpected token(s) preceding ';'
E:\skia\skia\include/private/SkTHash.h(172): error C2059: syntax error: '++'
E:\skia\skia\include/private/SkTHash.h(172): error C2059: syntax error: ')'
E:\skia\skia\include/private/SkTHash.h(172): error C2143: syntax error: missing ')' before ';'
E:\skia\skia\include/private/SkTHash.h(172): error C2238: unexpected token(s) preceding ';'
E:\skia\skia\include/private/SkTHash.h(172): error C3927: '->': trailing return type is not allowed after a non-function declarator
E:\skia\skia\include/private/SkTHash.h(172): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
E:\skia\skia\include/private/SkTHash.h(172): error C3927: '->': trailing return type is not allowed after a non-function declarator
E:\skia\skia\include/private/SkTHash.h(172): error C2059: syntax error: '='
E:\skia\skia\include/private/SkTHash.h(172): error C2059: syntax error: ')'
E:\skia\skia\include/private/SkTHash.h(172): error C2334: unexpected token(s) preceding '{'; skipping apparent function body
E:\skia\skia\include/private/SkTHash.h(235): error C2059: syntax error: 'for'
E:\skia\skia\include/private/SkTHash.h(235): error C2143: syntax error: missing ')' before ';'
E:\skia\skia\include/private/SkTHash.h(235): error C2238: unexpected token(s) preceding ';'
E:\skia\skia\include/private/SkTHash.h(235): error C2143: syntax error: missing ';' before '<'
E:\skia\skia\include/private/SkTHash.h(235): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
E:\skia\skia\include/private/SkTHash.h(235): error C2238: unexpected token(s) preceding ';'
E:\skia\skia\include/private/SkTHash.h(235): error C2143: syntax error: missing ';' before '++'
E:\skia\skia\include/private/SkTHash.h(235): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
E:\skia\skia\include/private/SkTHash.h(235): error C2059: syntax error: ')'
E:\skia\skia\include/private/SkTHash.h(235): error C2334: unexpected token(s) preceding '{'; skipping apparent function body
E:\skia\skia\include/private/SkTHash.h(240): error C2059: syntax error: 'return'
E:\skia\skia\include/private/SkTHash.h(240): error C2238: unexpected token(s) preceding ';'
E:\skia\skia\include/private/SkTHash.h(244): error C2144: syntax error: 'int' should be preceded by ';'
E:\skia\skia\include/private/SkTHash.h(490): warning C4003: not enough arguments for function-like macro invocation 'Q_FOREACH'
E:\skia\skia\include/private/SkTHash.h(491): warning C4003: not enough arguments for function-like macro invocation 'Q_FOREACH'
E:\skia\skia\include/private/SkTHash.h(496): warning C4003: not enough arguments for function-like macro invocation 'Q_FOREACH'
E:\skia\skia\include/private/SkTHash.h(497): warning C4003: not enough arguments for function-like macro invocation 'Q_FOREACH'
E:\skia\skia\include/private/SkTHash.h(490): error C2988: unrecognizable template declaration/definition
E:\skia\skia\include/private/SkTHash.h(513): note: see reference to class template instantiation 'SkTHashMap<K,V,HashK>' being compiled
E:\skia\skia\include/private/SkTHash.h(490): error C2059: syntax error: 'for'
E:\skia\skia\include/private/SkTHash.h(490): error C2143: syntax error: missing ')' before ';'
E:\skia\skia\include/private/SkTHash.h(490): error C2238: unexpected token(s) preceding ';'
E:\skia\skia\include/private/SkTHash.h(490): error C3927: '->': trailing return type is not allowed after a non-function declarator
E:\skia\skia\include/private/SkTHash.h(490): error C3484: syntax error: expected '->' before the return type
E:\skia\skia\include/private/SkTHash.h(490): error C3613: missing return type after '->' ('int' assumed)
E:\skia\skia\include/private/SkTHash.h(490): error C3646: 'control': unknown override specifier
E:\skia\skia\include/private/SkTHash.h(490): error C2143: syntax error: missing ';' before '&&'
E:\skia\skia\include/private/SkTHash.h(490): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
E:\skia\skia\include/private/SkTHash.h(490): error C2238: unexpected token(s) preceding ';'
E:\skia\skia\include/private/SkTHash.h(490): error C2059: syntax error: '++'
E:\skia\skia\include/private/SkTHash.h(490): error C2059: syntax error: ')'
E:\skia\skia\include/private/SkTHash.h(490): error C2143: syntax error: missing ')' before ';'
E:\skia\skia\include/private/SkTHash.h(490): error C2238: unexpected token(s) preceding ';'
E:\skia\skia\include/private/SkTHash.h(490): error C3927: '->': trailing return type is not allowed after a non-function declarator
E:\skia\skia\include/private/SkTHash.h(490): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
E:\skia\skia\include/private/SkTHash.h(490): error C3927: '->': trailing return type is not allowed after a non-function declarator
E:\skia\skia\include/private/SkTHash.h(490): error C2059: syntax error: '='
E:\skia\skia\include/private/SkTHash.h(490): error C2059: syntax error: ')'
E:\skia\skia\include/private/SkTHash.h(490): error C2334: unexpected token(s) preceding '{'; skipping apparent function body
E:\skia\skia\include/private/SkTHash.h(496): error C2988: unrecognizable template declaration/definition
E:\skia\skia\include/private/SkTHash.h(496): error C2059: syntax error: 'for'
E:\skia\skia\include/private/SkTHash.h(496): error C2143: syntax error: missing ')' before ';'
E:\skia\skia\include/private/SkTHash.h(496): error C2238: unexpected token(s) preceding ';'
E:\skia\skia\include/private/SkTHash.h(496): error C3927: '->': trailing return type is not allowed after a non-function declarator
E:\skia\skia\include/private/SkTHash.h(496): error C3484: syntax error: expected '->' before the return type
E:\skia\skia\include/private/SkTHash.h(496): error C3613: missing return type after '->' ('int' assumed)
E:\skia\skia\include/private/SkTHash.h(496): error C3646: 'control': unknown override specifier
E:\skia\skia\include/private/SkTHash.h(496): error C2143: syntax error: missing ';' before '&&'
E:\skia\skia\include/private/SkTHash.h(496): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
E:\skia\skia\include/private/SkTHash.h(496): error C2238: unexpected token(s) preceding ';'
E:\skia\skia\include/private/SkTHash.h(496): error C2059: syntax error: '++'
E:\skia\skia\include/private/SkTHash.h(496): error C2059: syntax error: ')'
E:\skia\skia\include/private/SkTHash.h(496): error C2143: syntax error: missing ')' before ';'
E:\skia\skia\include/private/SkTHash.h(496): error C2238: unexpected token(s) preceding ';'
E:\skia\skia\include/private/SkTHash.h(496): error C3927: '->': trailing return type is not allowed after a non-function declarator
E:\skia\skia\include/private/SkTHash.h(496): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
E:\skia\skia\include/private/SkTHash.h(496): error C3927: '->': trailing return type is not allowed after a non-function declarator
E:\skia\skia\include/private/SkTHash.h(496): error C2059: syntax error: '='
E:\skia\skia\include/private/SkTHash.h(496): error C2059: syntax error: ')'
E:\skia\skia\include/private/SkTHash.h(496): error C2334: unexpected token(s) preceding '{'; skipping apparent function body
E:\skia\skia\include/private/SkTHash.h(504): error C2988: unrecognizable template declaration/definition
E:\skia\skia\include/private/SkTHash.h(504): error C2059: syntax error: 'return'
E:\skia\skia\include/private/SkTHash.h(504): error C2238: unexpected token(s) preceding ';'
E:\skia\skia\include/private/SkTHash.h(507): error C2146: syntax error: missing ';' before identifier 'Iter'
E:\skia\skia\include/private/SkTHash.h(566): warning C4003: not enough arguments for function-like macro invocation 'Q_FOREACH'
E:\skia\skia\include/private/SkTHash.h(567): warning C4003: not enough arguments for function-like macro invocation 'Q_FOREACH'
E:\skia\skia\include/private/SkTHash.h(566): error C2988: unrecognizable template declaration/definition
E:\skia\skia\include/private/SkTHash.h(589): note: see reference to class template instantiation 'SkTHashSet<T,HashT>' being compiled
E:\skia\skia\include/private/SkTHash.h(566): error C2059: syntax error: 'for'
E:\skia\skia\include/private/SkTHash.h(566): error C2143: syntax error: missing ')' before ';'
E:\skia\skia\include/private/SkTHash.h(566): error C2238: unexpected token(s) preceding ';'
E:\skia\skia\include/private/SkTHash.h(566): error C3927: '->': trailing return type is not allowed after a non-function declarator
E:\skia\skia\include/private/SkTHash.h(566): error C3484: syntax error: expected '->' before the return type
E:\skia\skia\include/private/SkTHash.h(566): error C3613: missing return type after '->' ('int' assumed)
E:\skia\skia\include/private/SkTHash.h(566): error C3646: 'control': unknown override specifier
E:\skia\skia\include/private/SkTHash.h(566): error C2143: syntax error: missing ';' before '&&'
E:\skia\skia\include/private/SkTHash.h(566): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
E:\skia\skia\include/private/SkTHash.h(566): error C2238: unexpected token(s) preceding ';'
E:\skia\skia\include/private/SkTHash.h(566): fatal error C1003: error count exceeds 100; stopping compilation

    Is there something wrong with my build environment?
    BTW: including other private skia header file in a cpp file works fine.

Liang Jian

unread,
Dec 24, 2022, 5:11:20 AM12/24/22
to skia-d...@googlegroups.com
    It seems that the something in SkTHash.h conflicts with Qt header files. If I include it before Qt's header files it works fine.

--
You received this message because you are subscribed to the Google Groups "skia-discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email to skia-discuss...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/skia-discuss/ccf6a05e-9072-4ba2-9379-0df2e1409975n%40googlegroups.com.

Brian Osman

unread,
Dec 24, 2022, 9:20:48 AM12/24/22
to skia-d...@googlegroups.com
Ah, this appears to be due to Qt's foreach keyword (which is apparently implemented as a macro). SkTHash has a member function named foreach as well. Honestly, this feels like a Qt issue - polluting the global namespace with non-standard, lower-case, non-prefixed macros is all but guaranteed to eventually cause this kind of conflict.

Reply all
Reply to author
Forward
0 new messages