
#if defined(DEBUG) #define TODO(MSG) #else /// 抛出 MSG 编译错误 #define TODO(MSG) #error MSG // 这样不行. #好像不能在后面 #end 在 DEBUG 模式, 忽略 TODO(MSG)
Rlease 模式, 抛出编译错误 类似于 #error MSG
不知道有没有类似于 defined()预处理方法直接抛出错误
if(xxx){ /// 主流程 }else{ TODO('其他特殊情况,需要处理') } 这样在 release 编译时候,抛出错误 "其他特殊情况,需要处理"
1 philon 2022-02-18 09:31:54 +08:00 宏定义里`#`会用于字符串转换和拼接,不能用宏来定义新的宏 另外我不太理解你的需求,难道想把预处理和运行时的逻辑混在一起?怕是不现实 |
2 zhyl 2022-02-18 09:40:04 +08:00 |
3 xyz1001 2022-02-18 09:46:41 +08:00 C++11 的话可以这么写: ``` #if defined(DEBUG) #define TODO(MSG) #else /// 抛出 MSG 编译错误 #define TODO(MSG) static_assert(false) // 这样不行. #好像不能在后面 #endif int main() { TODO("test"); return 0; } ``` C 的话不是很熟悉有没有对应的写法 |
4 nicebird 2022-02-18 09:46:53 +08:00 不知道咋写,如果 c++直接 static_assert(false, msg) |
5 yolee599 2022-02-18 09:52:36 +08:00 1. “#” 用于连接两个字符串,不能这样用 2. 宏是编译预处理,不是运行时,所以不可能在运行的时候执行 #error “some msg” |
6 liuidetmks OP |
7 takitooru 2022-02-18 10:03:27 +08:00 #ifdef DEBUG #define TODO(MSG) #else #error Invalid TODO_ #endif |
8 ysc3839 2022-02-18 10:03:48 +08:00 via Android |
9 zhyl 2022-02-18 10:05:53 +08:00 或者用这种方式: ``` #define DO_PRAGMA_(x) _Pragma(#x) #define DO_PRAGMA(x) DO_PRAGMA_(x) #define TODO(msg) DO_PRAGMA(GCC error msg) int main() { TODO("compile error"); TODO("编译错误"); return 0; } ``` 已知的问题:clang 下 msg 如果是中文不会显示错误内容 |
10 Kasumi20 2022-02-18 10:19:22 +08:00 除非可以转义#号,不然只能一行变三行: #ifndef NDEBUG #error "TODO MSG" #endif |
11 lonewolfakela 2022-02-18 10:43:14 +08:00 @xyz1001 C 语言( c11 )的话,应该可以 #if defined(DEBUG) #define TODO(MSG) #else /// 抛出 MSG 编译错误 #define TODO(MSG) _Static_assert(false, MSG) #endif |
12 lesismal 2022-02-18 10:45:21 +08:00 #if defined(DEBUG) #define TODO(MSG) #else #define TODO error // 没必要还非得是宏函数吧 #end |
13 liuidetmks OP @lonewolfakela 这个我试了,只能英文 .. 中文是 \uxxxx, 不过目的也达到了,到错误处看代码就行了,只是别人编译的话看到错误可能莫名其妙 感谢回复 |
14 exiledkingcc 2022-02-18 10:48:49 +08:00 最简单的方案就是上面提到的 _Static_assert |
15 jackmod 2022-02-18 10:56:31 +08:00 不求严谨的话直接写一个超长的字符串也行 展开之后就是按变量名对待的,其结果就是未定义变量 |