#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 1
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 1
或者用这种方式:
``` #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 1
@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
不求严谨的话直接写一个超长的字符串也行
展开之后就是按变量名对待的,其结果就是未定义变量 |