#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 173 天前
宏定义里`#`会用于字符串转换和拼接,不能用宏来定义新的宏
另外我不太理解你的需求,难道想把预处理和运行时的逻辑混在一起?怕是不现实 |
2
zhyl 173 天前
|
3
xyz1001 173 天前 ![]() 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 173 天前
不知道咋写,如果 c++直接 static_assert(false, msg)
|
![]() |
5
yolee599 173 天前
1. “#” 用于连接两个字符串,不能这样用
2. 宏是编译预处理,不是运行时,所以不可能在运行的时候执行 #error “some msg” |
![]() |
6
liuidetmks OP |
7
takitooru 173 天前
#ifdef DEBUG
#define TODO(MSG) #else #error Invalid TODO_ #endif |
![]() |
8
ysc3839 173 天前 via Android
|
9
zhyl 173 天前 ![]() 或者用这种方式:
``` #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 173 天前
除非可以转义#号,不然只能一行变三行:
#ifndef NDEBUG #error "TODO MSG" #endif |
11
lonewolfakela 173 天前 ![]() @xyz1001 C 语言( c11 )的话,应该可以
#if defined(DEBUG) #define TODO(MSG) #else /// 抛出 MSG 编译错误 #define TODO(MSG) _Static_assert(false, MSG) #endif |
![]() |
12
lesismal 173 天前
#if defined(DEBUG)
#define TODO(MSG) #else #define TODO error // 没必要还非得是宏函数吧 #end |
![]() |
13
liuidetmks OP @lonewolfakela 这个我试了,只能英文 .. 中文是 \uxxxx, 不过目的也达到了,到错误处看代码就行了,只是别人编译的话看到错误可能莫名其妙 感谢回复
|
![]() |
14
exiledkingcc 173 天前
最简单的方案就是上面提到的 _Static_assert
|
15
jackmod 173 天前
不求严谨的话直接写一个超长的字符串也行
展开之后就是按变量名对待的,其结果就是未定义变量 |