用于处理编译错误的C / C ++预处理程序指令

时间:2014-01-18 17:57:06

标签: c++ c preprocessor-directive

标题可能有点令人困惑,所以我会尝试解释。

是否有一个预处理器指令可以封装一段代码,这样如果这段代码包含编译错误,那么应该编译其他一些代码呢?

这是一个说明我的动机的例子:

#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

以上示例不是我正在处理的问题,因此请不要提出具体的解决方案。

UPDATE:

感谢那里的所有负面评论。

这是确切的问题,也许有一点负面做法的人会有答案:

我试图在编译时决定某个变量a是数组还是指针。

我认为我可以使用这样一个事实:与指针不同,数组不具有L值。

因此,实质上,以下代码会产生数组的编译错误,但不会产生指针:

int a[10];
a = (int*)5;

我可以以某种方式"利用"这个编译错误是为了确定a是一个数组而不是指针,而不停止编译过程

由于

4 个答案:

答案 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