C++ C++;关于内联与定义的常见问题解答示例

C++ C++;关于内联与定义的常见问题解答示例,c++,C++,FAQ上有一个例子解释了内联和#定义之间的区别。代码在这里 链接是: 试用Visual C++,两个代码< > unSuffor( >和不安全(f-))/>代码>未增加 i>代码>两次。这个例子有错误吗 define的主要思想是它只是一个预处理器指令,这意味着: #define unsafe(i) ( (i) >= 0 ? (i) : -(i) ) 将在编译代码之前对其进行预处理,并替换该语句 unsafe(x++); 有以下几点 ((x++) >= 0 ? (x++) : -(

FAQ上有一个例子解释了内联和#定义之间的区别。代码在这里 链接是:

试用Visual C++,两个代码< > unSuffor(<代码> >和<代码>不安全(f-))/>代码>未增加<代码> i>代码>两次。这个例子有错误吗

define的主要思想是它只是一个预处理器指令,这意味着:

#define unsafe(i) ( (i) >= 0 ? (i) : -(i) )
将在编译代码之前对其进行预处理,并替换该语句

unsafe(x++);
有以下几点

((x++) >= 0 ? (x++) : -(x++));
每次计算x++时,x都会递增

您在获取正确的示例代码时遇到问题的一个可能原因可能是,您使用优化来编译代码,优化掉了所有未使用/不必要的代码

如果您没有在任何地方使用x,那么它将被视为未使用,因此不会包含在编译代码中。

define的主要思想是它只是一个预处理器指令,这意味着:

#define unsafe(i) ( (i) >= 0 ? (i) : -(i) )
将在编译代码之前对其进行预处理,并替换该语句

unsafe(x++);
有以下几点

((x++) >= 0 ? (x++) : -(x++));
每次计算x++时,x都会递增

您在获取正确的示例代码时遇到问题的一个可能原因可能是,您使用优化来编译代码,优化掉了所有未使用/不必要的代码


如果您没有在任何地方使用x,那么它将被视为未使用,因此不会包含在编译代码中。

刚刚测试了示例,请查看解释:

// A macro that returns the absolute value of i
#define unsafe(i)  \
    ((i) >= 0 ? (i) : -(i))

// An inline function that returns the absolute value of i
inline
int safe(int i)
{
    return i >= 0 ? i : -i;
}

int countCalls = 0;

int f()
{
    return countCalls++;
};

int main()
{
    int x = 0;
    int ans = 0;

    ans = unsafe(x++);   // Error! x is incremented twice
    ans = unsafe(f());   // Danger! f() is called twice

    // x = 2
    // countCalls = 2

    ans = safe(x++);     // Correct! x is incremented once
    ans = safe(f());     // Correct! f() is called once

    // x = 3
    // countCalls = 3

    return 0;
}

刚刚测试了示例,请查看解释:

// A macro that returns the absolute value of i
#define unsafe(i)  \
    ((i) >= 0 ? (i) : -(i))

// An inline function that returns the absolute value of i
inline
int safe(int i)
{
    return i >= 0 ? i : -i;
}

int countCalls = 0;

int f()
{
    return countCalls++;
};

int main()
{
    int x = 0;
    int ans = 0;

    ans = unsafe(x++);   // Error! x is incremented twice
    ans = unsafe(f());   // Danger! f() is called twice

    // x = 2
    // countCalls = 2

    ans = safe(x++);     // Correct! x is incremented once
    ans = safe(f());     // Correct! f() is called once

    // x = 3
    // countCalls = 3

    return 0;
}


发布代码,而不是指向代码的链接。示例中没有任何输出-您需要显示如何显示值。这个例子乍一看似乎没有任何问题。在宏中有一个比较。这种比较调用一个函数。所以它被评估了两次。顺便说一句,该网站是众所周知的相当好,所以你可以相信它。并使用debuggerLink检查您的所有疑问,该链接当前已断开。。。。这就是为什么您应该注意nhgrif的注释。发布代码,而不是代码链接。示例中没有任何输出-您需要显示您为显示值所做的操作。这个例子乍一看似乎没有任何问题。在宏中有一个比较。这种比较调用一个函数。所以它被评估了两次。顺便说一句,该网站是众所周知的相当好,所以你可以相信它。并使用debuggerLink检查您的所有疑问,该链接当前已断开。。。。这就是为什么您应该注意nhgrif的注释。奇怪的是,我使用了您的代码(实际我的代码是相同的),但从两个不安全()调用中都得到了x=1。你在用什么编译器?我使用Visual C++快件2010。另外,您正在使用哪些编译器选项?我使用的都是默认值。@user3078106您应该得到ans=0,因为它是增量后的,但ans=1。@user3078106我使用的是Visual Studio 2013,现在我在2010年也测试了它,它提供了相同的结果(正如我所预期的)。您是否有可能在发布模式下运行您的程序?在发布模式中提供的值不总是可信的。看不,我总是在调试模式下测试。我知道了。但是为什么uk4321说“应该得到ans=0,因为这是后增量,但ans=1”?post增量从哪里来?奇怪的是,我使用了您的代码(实际我的代码是相同的),但从两个不安全()调用中都得到了x=1。你在用什么编译器?我使用Visual C++快件2010。另外,您正在使用哪些编译器选项?我使用的都是默认值。@user3078106您应该得到ans=0,因为它是增量后的,但ans=1。@user3078106我使用的是Visual Studio 2013,现在我在2010年也测试了它,它提供了相同的结果(正如我所预期的)。您是否有可能在发布模式下运行您的程序?在发布模式中提供的值不总是可信的。看不,我总是在调试模式下测试。我知道了。但是为什么uk4321说“应该得到ans=0,因为这是后增量,但ans=1”?后增量来自哪里?我相信是-O或-O2。然而,如果你只是在学习,那么我建议你不要为那些旗帜而烦恼。相反,请注意,VC++解决方案(项目)有两个默认配置,即调试和发布。前者不使用优化,因此我建议在调试中运行示例代码,后者使用一些默认的优化技术进行优化,包括我上面描述的技术。然而,如果你只是在学习,那么我建议你不要为那些旗帜而烦恼。相反,请注意,VC++解决方案(项目)有两个默认配置,即调试和发布。前者不使用优化,因此我建议在调试中运行示例代码,而后者使用一些默认优化技术进行优化,包括我上面描述的技术。