代码作为 C 文件工作,但不作为C++文件,错误:'__builtin_types_compatible_p'未在此范围内声明

Code working as C-File but not as C++-File, Error: '__builtin_types_compatible_p' was not declared in this scope

本文关键字:文件 compatible types 声明 范围内 builtin C++ 不作为 错误 工作 代码      更新时间:2023-10-16

我编码了一个宏,可以在其中使用任意数量的值。如果这些是浮点值,它们将在uint_32中进行强制转换,然后在exampleff方法中使用所有值,在这里我使用varargs来获取所有值。如果我把下面的代码保存在C文件中,编译器不会给我任何错误,代码也能正常工作。如果我在c++文件中使用这个宏,它就不能再工作了。这是我的代码:

// Example program
#include <stdio.h>
#include <stdarg.h>
#include <stdint.h>
#define IS_FLOAT(x) (__builtin_types_compatible_p(typeof(x&), float))
#define CONVERT_F(x) (IS_FLOAT(x)?TRACE_FLOAT(x): (uint32_t)(x))
#define NUMARGS(...)  (sizeof((int[]){__VA_ARGS__})/sizeof(int))
// Make a FOREACH macro
#define FE_1(WHAT, X) WHAT(X) 
#define FE_2(WHAT, X, ...) WHAT(X),FE_1(WHAT, __VA_ARGS__)
#define FE_3(WHAT, X, ...) WHAT(X),FE_2(WHAT, __VA_ARGS__)
#define FE_4(WHAT, X, ...) WHAT(X),FE_3(WHAT, __VA_ARGS__)
#define FE_5(WHAT, X, ...) WHAT(X),FE_4(WHAT, __VA_ARGS__)
#define FE_6(WHAT, X, ...) WHAT(X),FE_5(WHAT, __VA_ARGS__)
//... repeat as needed
#define GET_MACRO(_1,_2,_3,_4,_5,_6,NAME,...) NAME 
#define FOR_EACH(action,...) 
GET_MACRO(__VA_ARGS__,FE_6,FE_5,FE_4,FE_3,FE_2,FE_1)(action,__VA_ARGS__)
#define NUM_ARGS(...) GET_MACRO(__VA_ARGS__,6,5,4,3,2,1)
#define EXAMPLE1(...) EXAMPLE2(NUMARGS(__VA_ARGS__), __VA_ARGS__)
#define EXAMPLE2(size, ...) (examplefff(size, FOR_EACH(CONVERT_F, __VA_ARGS__)))

static inline uint32_t TRACE_FLOAT (float f) {
union { uint32_t u; float f; } u;
u.f = f;
return u.u;
}
void examplefff(int numArgs, ...)
{
printf("n:%un", numArgs);
va_list args;
va_start(args, numArgs);
for(int i=0; i<numArgs; i++)
{
uint64_t test32 = va_arg(args, uint32_t);
printf("%un", test32);
}
va_end(args);
}
int main()
{
EXAMPLE1(456456,3244);
}

当我把这个文件编译成c文件时,编译器不会给我任何错误。当我把它编译成c++文件(我需要它(时,我会从编译器中得到以下输出。

x86-gcc_6.3.0bingcc testfile.cpp -Wall -std=gnu99 -O2  -o test.exe
cc1plus.exe: warning: command line option '-std=gnu99' is valid for C/ObjC but not for C++
testfile.cpp: In function 'void examplefff(int, ...)':
testfile.cpp:46:28: warning: format '%u' expects argument of type 'unsigned int', but argument 2 has type 'uint64_t {aka long long unsigned int}' [-Wformat=]
printf("%un", test32);
^
testfile.cpp: In function 'int main()':
testfile.cpp:6:51: error: expected primary-expression before 'typeof'
#define IS_FLOAT(x) (__builtin_types_compatible_p(typeof(x&), float))
^
testfile.cpp:7:23: note: in expansion of macro 'IS_FLOAT'
#define CONVERT_F(x) (IS_FLOAT(x)?TRACE_FLOAT(x): (uint32_t)(x))
^~~~~~~~
testfile.cpp:12:28: note: in expansion of macro 'CONVERT_F'
#define FE_2(WHAT, X, ...) WHAT(X),FE_1(WHAT, __VA_ARGS__)
^~~~
testfile.cpp:19:47: note: in expansion of macro 'FE_2'
#define GET_MACRO(_1,_2,_3,_4,_5,_6,NAME,...) NAME
^~~~
testfile.cpp:27:47: note: in expansion of macro 'FOR_EACH'
#define EXAMPLE2(size, ...) (examplefff(size, FOR_EACH(CONVERT_F, __VA_ARGS__)))
^~~~~~~~
testfile.cpp:25:23: note: in expansion of macro 'EXAMPLE2'
#define EXAMPLE1(...) EXAMPLE2(NUMARGS(__VA_ARGS__), __VA_ARGS__)
^~~~~~~~
testfile.cpp:53:3: note: in expansion of macro 'EXAMPLE1'
EXAMPLE1(456456,3244);
^~~~~~~~
testfile.cpp:6:63: error: expected primary-expression before 'float'
#define IS_FLOAT(x) (__builtin_types_compatible_p(typeof(x&), float))
^
testfile.cpp:7:23: note: in expansion of macro 'IS_FLOAT'
#define CONVERT_F(x) (IS_FLOAT(x)?TRACE_FLOAT(x): (uint32_t)(x))
^~~~~~~~
testfile.cpp:12:28: note: in expansion of macro 'CONVERT_F'
#define FE_2(WHAT, X, ...) WHAT(X),FE_1(WHAT, __VA_ARGS__)
^~~~
testfile.cpp:19:47: note: in expansion of macro 'FE_2'
#define GET_MACRO(_1,_2,_3,_4,_5,_6,NAME,...) NAME
^~~~
testfile.cpp:27:47: note: in expansion of macro 'FOR_EACH'
#define EXAMPLE2(size, ...) (examplefff(size, FOR_EACH(CONVERT_F, __VA_ARGS__)))
^~~~~~~~
testfile.cpp:25:23: note: in expansion of macro 'EXAMPLE2'
#define EXAMPLE1(...) EXAMPLE2(NUMARGS(__VA_ARGS__), __VA_ARGS__)
^~~~~~~~
testfile.cpp:53:3: note: in expansion of macro 'EXAMPLE1'
EXAMPLE1(456456,3244);
^~~~~~~~
testfile.cpp:6:68: error: '__builtin_types_compatible_p' was not declared in this scope
#define IS_FLOAT(x) (__builtin_types_compatible_p(typeof(x&), float))
^
testfile.cpp:7:23: note: in expansion of macro 'IS_FLOAT'
#define CONVERT_F(x) (IS_FLOAT(x)?TRACE_FLOAT(x): (uint32_t)(x))
^~~~~~~~
testfile.cpp:12:28: note: in expansion of macro 'CONVERT_F'
#define FE_2(WHAT, X, ...) WHAT(X),FE_1(WHAT, __VA_ARGS__)
^~~~
testfile.cpp:19:47: note: in expansion of macro 'FE_2'
#define GET_MACRO(_1,_2,_3,_4,_5,_6,NAME,...) NAME
^~~~
testfile.cpp:27:47: note: in expansion of macro 'FOR_EACH'
#define EXAMPLE2(size, ...) (examplefff(size, FOR_EACH(CONVERT_F, __VA_ARGS__)))
^~~~~~~~
testfile.cpp:25:23: note: in expansion of macro 'EXAMPLE2'
#define EXAMPLE1(...) EXAMPLE2(NUMARGS(__VA_ARGS__), __VA_ARGS__)
^~~~~~~~
testfile.cpp:53:3: note: in expansion of macro 'EXAMPLE1'
EXAMPLE1(456456,3244);
^~~~~~~~
testfile.cpp:6:51: error: expected primary-expression before 'typeof'
#define IS_FLOAT(x) (__builtin_types_compatible_p(typeof(x&), float))
^
testfile.cpp:7:23: note: in expansion of macro 'IS_FLOAT'
#define CONVERT_F(x) (IS_FLOAT(x)?TRACE_FLOAT(x): (uint32_t)(x))
^~~~~~~~
testfile.cpp:11:23: note: in expansion of macro 'CONVERT_F'
#define FE_1(WHAT, X) WHAT(X)
^~~~
testfile.cpp:12:36: note: in expansion of macro 'FE_1'
#define FE_2(WHAT, X, ...) WHAT(X),FE_1(WHAT, __VA_ARGS__)
^~~~
testfile.cpp:19:47: note: in expansion of macro 'FE_2'
#define GET_MACRO(_1,_2,_3,_4,_5,_6,NAME,...) NAME
^~~~
testfile.cpp:27:47: note: in expansion of macro 'FOR_EACH'
#define EXAMPLE2(size, ...) (examplefff(size, FOR_EACH(CONVERT_F, __VA_ARGS__)))
^~~~~~~~
testfile.cpp:25:23: note: in expansion of macro 'EXAMPLE2'
#define EXAMPLE1(...) EXAMPLE2(NUMARGS(__VA_ARGS__), __VA_ARGS__)
^~~~~~~~
testfile.cpp:53:3: note: in expansion of macro 'EXAMPLE1'
EXAMPLE1(456456,3244);
^~~~~~~~
testfile.cpp:6:63: error: expected primary-expression before 'float'
#define IS_FLOAT(x) (__builtin_types_compatible_p(typeof(x&), float))
^
testfile.cpp:7:23: note: in expansion of macro 'IS_FLOAT'
#define CONVERT_F(x) (IS_FLOAT(x)?TRACE_FLOAT(x): (uint32_t)(x))
^~~~~~~~
testfile.cpp:11:23: note: in expansion of macro 'CONVERT_F'
#define FE_1(WHAT, X) WHAT(X)
^~~~
testfile.cpp:12:36: note: in expansion of macro 'FE_1'
#define FE_2(WHAT, X, ...) WHAT(X),FE_1(WHAT, __VA_ARGS__)
^~~~
testfile.cpp:19:47: note: in expansion of macro 'FE_2'
#define GET_MACRO(_1,_2,_3,_4,_5,_6,NAME,...) NAME
^~~~
testfile.cpp:27:47: note: in expansion of macro 'FOR_EACH'
#define EXAMPLE2(size, ...) (examplefff(size, FOR_EACH(CONVERT_F, __VA_ARGS__)))
^~~~~~~~
testfile.cpp:25:23: note: in expansion of macro 'EXAMPLE2'
#define EXAMPLE1(...) EXAMPLE2(NUMARGS(__VA_ARGS__), __VA_ARGS__)
^~~~~~~~
testfile.cpp:53:3: note: in expansion of macro 'EXAMPLE1'
EXAMPLE1(456456,3244);
^~~~~~~~

我想在C文件和C++文件中使用宏"EXAMPLE"。那么我做错了什么?

编辑:这也是我的第一个问题,所以任何关于如何提出更好问题的建议都将不胜感激。

来自gcc文档:

注意:此构造仅适用于C.

对于C++,你可能想看看这个答案:

如何在c++中确定arg类型