标题可能有点令人困惑,所以我会尝试解释。
是否有一个预处理器指令可以封装一段代码,这样如果这段代码包含编译错误,那么应该编译其他一些代码呢?
这是一个说明我的动机的例子:
#compile_if_ok
int a = 5;
a += 6;
int b = 7;
b += 8;
#else
int a = 5;
int b = 7;
a += 6;
b += 8;
#endif
以上示例不是我正在处理的问题,因此请不要提出具体的解决方案。
感谢那里的所有负面评论。
这是确切的问题,也许有一点负面做法的人会有答案:
我试图在编译时决定某个变量a
是数组还是指针。
我认为我可以使用这样一个事实:与指针不同,数组不具有L值。
因此,实质上,以下代码会产生数组的编译错误,但不会产生指针:
int a[10];
a = (int*)5;
我可以以某种方式"利用"这个编译错误是为了确定a
是一个数组而不是指针,而不停止编译过程?
由于
答案 0 :(得分:5)
没有
大型C ++(和其他语言)项目在其构建系统中设计了一个“配置”阶段,以尝试编译不同的代码片段,生成一组预处理器定义,指示哪些工作有效,这种情况并不少见,所以然后,正确编译项目可以使用#ifdef
/ #else
/ #endif
语句中的预处理程序定义来选择备选方案。对于许多UNIX / Linux软件包,运行“./configure”脚本会对此进行协调。您可以在http://www.gnu.org/software/autoconf/
autoconf
工具
答案 1 :(得分:1)
标准C不支持此功能。但是,许多命令shell使这相当简单。例如,在bash中,您可以编写如下脚本:
#!/bin/bash
# Try to compile the program with Code0 defined.
if cc -o program -DCode0= "$*"; then
# That worked, do nothing extra. (Need some command here due to bash syntax.)
/bin/true
else
# The first compilation failed, try without Code0 defined.
cc -o program "$*"
fi
./program
然后您的源代码可以测试是否定义了Code0
:
#if defined Code0
foo bar;
#else
#include <stdio.h>
int main(void)
{
printf("Hello, world.\n");
return 0;
}
#endif
但是,通常有更好的方法可以使源代码响应环境或目标平台。
答案 2 :(得分:1)
C11 _Generic宏可能能够处理这个问题。如果不是,那你就搞砸了。
不在C ++预处理器中。在C ++中,您可以轻松地使用重载决策或模板甚至表达式SFINAE或类似的东西来执行不同的功能,具体取决于a
是否为数组。但是在预处理之后仍然会发生这种情况。
如果你需要一个既有效的C又有效的C ++,你可以做的最好的就是#ifdef __cplusplus
并以这种方式处理它。他们的共同子集(主要是C89)肯定没有能够在编译的任何阶段处理这个问题。
答案 3 :(得分:1)
关于更新的问题:
如果您正在编写C ++,请使用模板...
具体来说,要测试变量的类型,你有助手:std :: enable_if,std :: is_same,std :: is_pointer等
请参阅类型支持模块:http://en.cppreference.com/w/cpp/types