在Visual Studio中编译与在命令行中使用cl编译

时间:2017-12-13 20:17:21

标签: c visual-studio-2015 compilation cl

我有一个用于在大学课程中测试C程序的脚本。我编译学生'只需运行命令cl file.c,即可使用VS2015的开发人员命令提示符生成文件。但是,我发现在一些(非常罕见的)情况下,与VS2015上运行它们相比,我获得了不同的输出(我们引导学生在该IDE中检查他们的程序)。 经过一些调查后,我发现当我包含一个标题(.h)文件时会发生这种情况(参见下面的代码示例)。

cl实际上与VS2015使用的编译器相同吗?如果是 - 那我怎么会得到不同的结果。如果不是 - 我应该给出什么命令以获得类似的结果?

代码示例 - 运行应评估数学字符串的函数的程序。无论普通的数学顺序优先级如何,评估都是从左到右完成的:

test_data.h

#ifndef _TEST_DATA_H
#define _TEST_DATA_H

char *mathString2 = "64 / 8 * 8 - 8 / 8 / 8 / 8 * 8 * 8 * 8";

#endif /* _TEST_DATA_H */

test.c的

#include <stdio.h>
#include "test_data.h"

// Q1
double string2uint(char str[])
{
    int i = 0;
    double res = 0;
    while (str[i] != '\0') {
        res = res * 10 + (str[i] - '0');
        i++;
    }
    return res;
}

void calcMathString(char mathString[])
{
    int i, j = 0;
    double e = 0;
    char t = '+', str_n[101];
    for (; mathString[j] != '\0'; j++)
    {
        i = 0;
        while (mathString[j] != '\0') {
            str_n[i] = mathString[j];
            if (mathString[j] == ' ')
            {
                str_n[i] = '\0';
                i++;
                j++;
                break;
            }
            if (mathString[j + 1] == '\0')
            {
                i++;
                str_n[i] = '\0';
                j++;
                break;
            }
            i++;
            j++;
        }
        if (t == '+') {
            e = e + string2uint(str_n);
        }
        if (t == '-') {
            e = e - string2uint(str_n);
        }
        if (t == '*') {
            e = e*string2uint(str_n);
        }
        if (t == '/') {
            e = e / string2uint(str_n);
        }
        t = mathString[j];
        j = j + 1;
    }
    printf("%s = %.3lf\n", mathString, e);
}

int main()
{
    char *mathString1 = "64 / 8 * 8 - 8 / 8 / 8 / 8 * 8 * 8 * 8";
    calcMathString(mathString1);
    calcMathString(mathString2);
    return 0;
}

请注意mathString1, mathString2是相同的。 我用cl编译的输出:

64 / 8 * 8 - 8 / 8 / 8 / 8 * 8 * 8 * 8 = 56.000
64 / 8 * 8 - 8 / 8 / 8 / 8 * 8 * 8 * 8 = 48.000

在VS中运行时得到的输出:

64 / 8 * 8 - 8 / 8 / 8 / 8 * 8 * 8 * 8 = 56.000
64 / 8 * 8 - 8 / 8 / 8 / 8 * 8 * 8 * 8 = 56.000

1 个答案:

答案 0 :(得分:0)

VS运行与命令提示符相同的cl.exe编译器,但是在VS中构建几乎肯定会传递更多的命令行参数。

使用&#34; msbuild&#34;从命令行生成与VS将使用的相同的构建序列。