有没有办法让'某事;'做任何事情?

时间:2014-02-16 04:28:20

标签: c++

在查看代码时,我会看到人们编写如下行:

something;

人们总是说这样的语句是愚蠢的,什么都不做。我开始怀疑C ++中是否有办法让它做任何事情。

语句这个词在C ++中定义得很好。所以我实际上有两个问题:

  1. 有没有办法让这样的线做任何事情,而不使用宏?
  2. 有没有办法让某事成为一个对象,所以something;实际上是一个标识符声明(我希望我理解并正确使用该术语),并做任何事情。我猜这个宏使它不是标识符声明。
  3. 所以带宏的代码示例:

    something.cpp:

    #include <iostream>
    int main() {
        #include "something.hpp"
        something;
        return 0;
    }
    

    something.hpp:

    #define something std::cout<<"It's something!\n"
    

    当然something;会做点什么。

    是否有办法实现something.hpp以便它不使用宏,并且最好定义一些类并使something成为它的实例并执行用户编写的代码。

    include的展示位置。是故意选择的,因此可以注入任何代码。 E.g:

    class T{};
    T something;
    

    请注意,我认为我的第二个问题由templatetypedef回答了问题。

2 个答案:

答案 0 :(得分:5)

我有一份C ++ 11 ISO标准的草稿,我认为我们可以安全地说答案是否定的。表格声明

identifier;

是一个表达式语句。规范(§6.2.1)说明

  

评估表达式并丢弃其值。

那么表达式identifier评估的是什么?嗯,这是一个标识符表达式,规范(§5.1.1/ 6)表示

  

结果是由标识符表示的实体。

因此,此表达式的效果是“评估identifier给出的实体,然后丢弃结果。”这里没有选择,所以这个表达应该总是没有效果。

希望这有帮助!

答案 1 :(得分:0)

并非所有表达式语句都是no-ops。如果它们没有副作用或者它们是空语句,它们可以是无操作。例如:

vector.size(); // Did nothing with the variable
; // null statement
0; // Random zero in the middle of code, confuse readers galore
   // or use as a breakpoint
doSomething(); // Do something

所以在你的情况下,我看不出任何实际的原因,为什么学生会自己写一个变量,然后单独使用分号,除非它是一个拼写错误或用作断点。