用戶希望通過宏定義實現:@"hello" → "hello" 的替換,模仿 Objective-C 的字符串字面量語法。
C/C++ 標準規定:宏名稱(標識符)只能由字母、數字、下劃線組成,不能包含 @ 符號。編譯器會在預處理階段報錯:
error: '@' is not a valid character in a macro name
#define S(x) (x)
// 使用
const char* str = S("hello"); // 展開為 ("hello")
優點:標準合規、類型安全、可調試。缺點:需加括號,語法不完全一致。
constexpr const char* operator""_s(const char* str, size_t) {
return str;
}
// 使用
auto str = "hello"_s; // C++14 起支持
優點:語法優雅、零開銷、類型安全。需 C++14 支持。
template
constexpr const char* toStr(const char (&arr)[N]) {
return arr;
}
// 使用
auto str = toStr("hello");
Objective-C 是 C 的超集,編譯器在詞法分析階段就識別 @" 為特殊 Token,生成 NSString* 對象,而非簡單的字符串字面量。這是編譯器內建特性,非預處理器宏可模擬。
| 方案 | 標準 | 語法 | 適用場景 |
|---|---|---|---|
| 函數式宏 | C89+ | S("str") | 跨平台、舊標準 |
| 用戶定義字面量 | C++14+ | "str"_s | 現代 C++ 項目 |
| 模板函數 | C++11+ | toStr("str") | 需編譯期計算 |
建議根據項目 C++ 標準版本選擇,切勿嘗試繞過語言語法限制。