在查看代码时,我会看到人们编写如下行:
something;
人们总是说这样的语句是愚蠢的,什么都不做。我开始怀疑C ++中是否有办法让它做任何事情。
语句这个词在C ++中定义得很好。所以我实际上有两个问题:
something;
实际上是一个标识符声明(我希望我理解并正确使用该术语),并做任何事情。我猜这个宏使它不是标识符声明。所以带宏的代码示例:
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回答了问题。
答案 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
所以在你的情况下,我看不出任何实际的原因,为什么学生会自己写一个变量,然后单独使用分号,除非它是一个拼写错误或用作断点。