2011-08-18 82 views
2

我在写一个属性填充以从库的字符串实现中获取原始c-string。这个特定的字符串类,例如string_t具有成员length()data()。 当length() == 0data() == nullptr函数本地静态变量是否阻止函数内联?

现在我正在使用不喜欢空字符串的api,因此我的填充函数返回空字符串的地址。

inline char const* get_safe_c_str(string_t const& str){ 
    static char const empty[] = ""; 
    return str.length() > 0 ? str.data() : ∅ 
} 

是否我的静态变量阻止编译器内联这个函数?

+2

顺便说一句,你可以返回字符串文字的地址。他们的一生是整个程序(或者dll的生命周期,如果你是动态加载和卸载的,但是就标准而言,这是不合适的,并且不会比你的本地静态更糟) –

+0

真的吗?很酷。这比静态数组好得多。 – Flame

+0

我刚刚注意到上面的代码有问题,我返回的是数组的地址,而不是第一个元素的地址。这不会编译,因为你不能从'char const(*)[1]'(指向char数组的指针)转换为'char const *'(指向char的指针)。 – Flame

回答

4

不,它不会阻止内联。仍然只有一个函数本地静态变量的实例,并且在函数的任何位置都以内联方式展开,则将使用该实例。

无论是特定的编译器与特定选项实际上内联这样的功能是另一回事,你不得不编译程序,看看你的编译器实际上做了,但没有技术原因的功能罐”内联t

但是请注意,在您的程序中,return str.length() > 0 ? str.data() : "";也可以正常工作;一个字符串文字具有静态存储持续时间并存在,直到程序终止。