如何在C++中抛出一个编译错误?

软件工程师、主攻高级编程语言虚拟机的设计与实现

13 👍 / 6 💬

问题描述

详细说一下,就是代码本身没有任何问题 就只是逻辑需要,如何利用代码实现 将本身没有任何错误的代码在编译的时候让编译器产生一个error?
例如
//某一个代码块
if(something)
{
//这里要怎么做才能让编译器产生一个我自己定义的error呢?


----------------------------------------------------
分割线
----------------------------------------------------
比如我自己写了一个test.dll 导出函数名为
void fun(void)
调用的时候采取动态加载
typedef void (_stdcall *FUN)();
HMODULE hDLL = LoadLibrary("test.dll");
FUN fp_fun = FUN(GetProcAddress(hDLL,"fun"));

在获得导出函数的时候如果将导出函数名写错在编译的时候我希望他就要抛出一个error 但是实际上不会 只会在执行的时候出错 如何避免由于导出函数名写错导致程序崩溃的问题?

题主的问题得看问题描述里的那个具体场景的例子才可以确定是什么意思。

本质上说题主是想让一部分代码在编译时就运行(求值),并在满足一定条件时触发一个编译错误。是这样么题主?

是的话,就那个test.dll的例子而言,光靠标准C++,使用常规的编译流程来做的话,是做不到的。C++就算到C++17,可以在编译时求值的功能也做不到“读一个DLL,看看里面的导出函数都有哪些,然后看看我这源码里传入的字符串的内容是否能匹配上导出函数里的”这种事情。

但是这样的功能并不是一定要靠标准C++、使用常规的编译流程做啊。

可以想想其它办法,例如说使用现有编译器的API来写编译器插件或者静态分析器——于是就可以在编译时(或静态分析时)执行一些自己的逻辑了。

例如说Clang编译器所开放出来的Clang Static Analyzer框架就可以做这种事情。官网上列举的WinAPI例子就颇有点跟题主的需求相似的味道:

List of potential checkers

题主要做的事情就是写一个analyzer,检查GetProcAddress()的参数,第一个参数是不是来自一个LoadLibrary()调用的结果,是的话提取出library名字,主动去加载一下这个library看它是否存在;存在的话,然后第二个参数是否能从这个library的导出表里找出对应的项。

就这么简单。