我正在学习gcc的cleanup attribute,并了解当变量超出范围时它如何调用函数,我不明白为什么你可以使用"清理"有或没有下划线。 带下划线的文档的文档或文档在哪里?
上面的gcc文档显示如下:
__attribute__ ((cleanup(cleanup_function)))
但是,我读过的大多数代码示例都显示如下:
__attribute__ ((__cleanup__(cleanup_function)))
前:
请注意,第一个示例链接表明它们是相同的,当然编码证明了这一点,但他最初是如何知道的?这是从哪里来的?
为何与众不同? __cleanup__
在哪里定义或记录,而不是cleanup
?
我的根本问题在于我不知道我不知道的事情,因此我试图暴露我未知的一些未知因素,以便他们成为众所周知的未知数,直到我可以研究它们并让它们成为众所周知的知识。
我的想法是,gcc预处理器指令可能有一些全局应用的原则,你可以在任何指令之前或之后任意添加下划线? - 或者也许只有其中一些? - 或者它可能以某种方式修改预处理程序指令或属性,并且有些情况下,一个方法(有或没有额外的下划线)优先于另一个方法?
答案 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
。
(但请注意,属性不是预处理程序指令。)