代码作为 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
我编码了一个宏,可以在其中使用任意数量的值。如果这些是浮点值,它们将在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类型
相关文章:
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 读取文件并输入到矢量中
- 在C++中查找文件
- c++库的公共头文件中应该包含什么
- 用c++从输入文件中读取另一行
- Cppcheck生成xml转储文件
- 读取文件的最后一行并输入到链接列表时出错
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 如何将内容数组写入文本文件?
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到