2

这是一个小程序:

#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 的工作方式是否正确,或者我应该争取更简单的语法?

4

1 回答 1

3

没有。直到 4.8 版才在 GCC 中实现通用属性这可以在这里看到:http:
//gcc.gnu.org/gcc-4.7/cxx0x_status.html
http://gcc.gnu.org/gcc-4.8/cxx0x_status .html

于 2013-10-20T06:49:04.133 回答