可变宏编译错误
VARIADIC MACRO compile error
我想学习如何使用宏。
我只是写了一个示例,但未能在我的本地g++4.9上编译
#define P(...) printf("13", ##__VA_ARGS__)
int main() {
// your code goes here
P();
return 0;
}
我将得到如下编译错误
g++ -std=c++14 -O2 -Wall -pedantic -pthread main.cpp && ./a.out
main.cpp: In function 'int main()':
main.cpp:4:42: error: expected primary-expression before ')' token
#define P(...) printf("13", ##__VA_ARGS__)
^
main.cpp:7:5: note: in expansion of macro 'P'
P();
^
但是同样的代码可以在ideone....上编译http://ideone.com/ucEXXz
和VS2015。
对此有什么合理的解释吗?
如何为所有编译器编写一个可移植的宏....
谢谢。
在C中,接受变量参数的函数需要一个原型声明,而在c++中,所有函数都需要一个原型。printf
的声明见stdio.h
#include <stdio.h>
#define P(...) printf("13", ##__VA_ARGS__)
int main() {
P();
return 0;
}
##__VA_ARGS__
语法不规范。这是一个由GCC实现的"吞逗号,如果__VA_ARGS__
是空的"扩展,并且似乎已被其他编译器采用。
-std=c++14
的行为:
编译器可以接受几种基本标准,如' c90 '或' c++98 ',以及这些标准的GNU方言,如' gnu90 '或' GNU ++98 '。当指定了基本标准后,编译器接受所有遵循该标准的程序以及那些使用与该标准不冲突的GNU扩展的程序。例如,-std=c90关闭与ISO c90不兼容的GCC的某些特性,例如asm和typeof关键字,但不关闭在ISO c90中没有意义的其他GNU扩展,例如省略?:表达式的中间项。
-std=
的GCC文档
##__VA_ARGS__
扩展名与标准不冲突。导致它被coliru站点拒绝的原因是设置了-pedantic
标志。
有效的ISO C和ISO c++程序在使用或不使用此选项时应该正确编译(尽管极少数需要-ansi或-std选项来指定所需的ISO C版本)。然而,如果没有此选项,某些GNU扩展和传统的C和c++特性也会被支持。使用此选项,它们将被拒绝。
-pedantic
的GCC文档
相关文章:
- 用MacOS Mojave编译C++:致命错误:mpi.h:没有这样的文件或目录
- std::is_base_of表示ctor编译错误
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- Qt5:使用QCommandLineParser类时出现奇怪的编译错误
- Qt Cmake 错误编译"GuiSupportQt not found"
- Opengl 精度转换错误编译错误 E0415
- 库将ARM架构错误编译为架构X64
- RT 音频 Mac 错误 g++ 编译错误
- 错误编译Boost.log
- 错误编译QT创建者 / QT窗口小部件示例
- 错误编译MIPS32
- Visual Studio 2013 中的错误(编译和运行代码)
- 链接错误编译qt项目在visual 2010
- 无法用模板错误编译nsgmls
- 奇怪的错误.编译失败
- 如果有人调用c++中的方法,则强制错误(编译时)
- 来自autoconf测试的错误编译命令
- 时间限制超出错误C++编译
- SFML 2.3 和 CodeBlocks 错误编译