这是一个小程序:
#include <iostream>
#include <string>
#include <cstdlib>
void Exit_With_Error(std::string const& error_message);
int main(){
Exit_With_Error("Error X occurred.");
return 0;
}
void Exit_With_Error(std::string const& error_message){
std::cerr << error_message << std::endl;
exit(EXIT_FAILURE);
return;
}
如您所见,函数Exit_With_Error从未真正返回。我想我会添加一个属性来更好地说明这一点。此处的文档使我相信它应该如下所示:
#include <iostream>
#include <string>
#include <cstdlib>
[[noreturn]] void Exit_With_Error(std::string const& error_message);
int main(){
Exit_With_Error("Error X occurred.");
return 0;
}
[[noreturn]] void Exit_With_Error(std::string const& error_message){
std::cerr << error_message << std::endl;
exit(EXIT_FAILURE);
return;
}
但是,它不会编译:
main.cpp:6:1: error: expected unqualified-id before ‘[’ token
main.cpp: In function ‘int main()’:
main.cpp:9:37: error: ‘Exit_With_Error’ was not declared in this scope
main.cpp: At global scope:
main.cpp:13:1: error: expected unqualified-id before ‘[’ token
不过我得到了这个工作!
#include <iostream>
#include <string>
#include <cstdlib>
__attribute__((noreturn)) void Exit_With_Error(std::string const& error_message);
int main(){
Exit_With_Error("Error X occurred.");
return 0;
}
__attribute__((noreturn)) void Exit_With_Error(std::string const& error_message){
std::cerr << error_message << std::endl;
exit(EXIT_FAILURE);
return;
}
我的问题: 如何使 [[attribute]] 语法起作用?我正在使用 gcc 上的 c++11 标志进行编译。例如,
g++ -std=c++11 -o main main.cpp
但它不工作。我有 4.7.2 版本的编译器。DOES 的工作方式是否正确,或者我应该争取更简单的语法?