gcc预编译器指令__attribute __((__ cleanup__))vs((清理))(vs没有下划线?)

时间:2015-09-25 15:08:17

标签: macros c-preprocessor preprocessor-directive

我正在学习gcc的cleanup attribute,并了解当变量超出范围时它如何调用函数,我不明白为什么你可以使用"清理"有或没有下划线。 下划线的文档的文档或文档在哪里?

上面的gcc文档显示如下:

__attribute__ ((cleanup(cleanup_function)))

但是,我读过的大多数代码示例都显示如下:

__attribute__ ((__cleanup__(cleanup_function)))

前:

请注意,第一个示例链接表明它们是相同的,当然编码证明了这一点,但他最初是如何知道的?这是从哪里来的?

为何与众不同? __cleanup__在哪里定义或记录,而不是cleanup

我的根本问题在于我不知道我不知道的事情,因此我试图暴露我未知的一些未知因素,以便他们成为众所周知的未知数,直到我可以研究它们并让它们成为众所周知的知识。

我的想法是,gcc预处理器指令可能有一些全局应用的原则,你可以在任何指令之前或之后任意添加下划线? - 或者也许只有其中一些? - 或者它可能以某种方式修改预处理程序指令或属性,并且有些情况下,一个方法(有或没有额外的下划线)优先于另一个方法?

2 个答案:

答案 0 :(得分:7)

您可以定义宏cleanup,因为它不是为编译器保留的名称。您不能定义名为__cleanup__的名称。__cleanup__。这可以保证使用 public IEnumerable<String> GetStartList() { //int count = 0; var result = new List<String>(10); string query = "SELECT PlaceName, Lat, Lng from Places"; SqlCommand cmd = new SqlCommand(query, con); con.Open(); using (SqlDataReader dr = cmd.ExecuteReader()) { while (dr.Read()) { var mystring = dr.GetString(0); var lat = dr.GetDouble(1); result.Add(mystring); //result.Add(lat.ToString()); //count++; } } con.Close(); return result; } 的代码不受其他代码的影响(当然,前提是其他代码的行为)。

答案 1 :(得分:5)

正如https://gcc.gnu.org/onlinedocs/gcc/Attribute-Syntax.html#Attribute-Syntax所解释的那样:

  

您可以选择在名称前后指定__的属性名称。这允许您在头文件中使用它们,而不用担心可能的同名宏。例如,您可以使用属性名称__noreturn__代替noreturn

(但请注意,属性不是预处理程序指令。)