请考虑以下程序(请参阅此处的实时演示).
#include <stdio.h>
int main(void)
{
int ; // Missing variable name
puts("Surprise");
}
Run Code Online (Sandbox Code Playgroud)
我的编译器gcc 4.8.1给出了以下警告:
[警告]空声明中无用的类型名称[默认启用]
为什么编译好?我不应该得到编译错误吗?当我将它编译为C++程序时,g ++ 4.8.1给出以下错误:
[错误]声明没有声明任何内容[-fpermissive]
为什么这不起作用?
0. #define CONCAT(x, y) x ## y
1.
2. #define VAR_LINE(x) \
3. int CONCAT(_anonymous, __LINE__) = x
4.
5. #define VAR_LINE2(x) \
6. int _anonymous ## x = 1
7.
8. int main()
9. {
10. VAR_LINE(1);
11. VAR_LINE(1);
12. VAR_LINE(1);
13. VAR_LINE2(__LINE__);
14. }
Run Code Online (Sandbox Code Playgroud)
上述宏观扩张的结果
int _anonymous__LINE__ = 1;
int _anonymous__LINE__ = 1;
int _anonymous__LINE__ = 1;
int _anonymous13 = 1;
Run Code Online (Sandbox Code Playgroud)
如果我不必将该__LINE__宏写为参数,那将会很方便.
我认为这个问题非常清楚.我希望能够生成匿名变量,以便在同一范围内声明多个变量时,此宏不会因重定义错误而失败.我的想法是使用预定义的__LINE__宏,因为不会像这样在同一行上声明变量.但宏观扩张困扰我,你能帮忙吗?
感谢Luc Touraille.但是,建议的解决方案存在一个小问题.操作数和##运算符之间必须有空格(显然标准说明不然,但如果运算符和操作数之间没有空格,则PS3风格的GCC不会正确扩展宏).
#define _CONCAT(x,y) x ## y
#define CONCAT(x,y) …Run Code Online (Sandbox Code Playgroud) 标准C++类型(如int或char)具有ctors,因此您可以使用以下表达式:
int a = int(67); // create anonymous variable and assing it to variable a
int b(13); // initialize variable b
int(77); // create anonymous variable
Run Code Online (Sandbox Code Playgroud)
用户定义的类型(结构或类)能够做同样的事情:
struct STRUCT
{
STRUCT(int a){}
};
STRUCT c = STRUCT(67);
STRUCT d(13);
STRUCT(77);
Run Code Online (Sandbox Code Playgroud)
问题是:为什么我们可以通过引用匿名结构或类实例传递,但不能传递标准类型?
struct STRUCT
{
STRUCT(int a){}
};
void func1(int& i){}
void func2(STRUCT& s){}
void func3(int i){}
void func4(STRUCT s){}
void main()
{
//func1(int(56)); // ERROR: C2664
func2(STRUCT(65)); // OK: anonymous object is created then assigned to a reference
func3(int(46)); // …Run Code Online (Sandbox Code Playgroud) 假设有以下功能:
void SetTheSize(const SIZE *size) { ... }
Run Code Online (Sandbox Code Playgroud)
有没有办法在不指定SIZE变量的情况下调用该函数?例如,
SetTheSize((const SIZE*)&{10, 10});
Run Code Online (Sandbox Code Playgroud)
编辑: 我应该提到SIZE是一个结构,没有SIZE(int,int)构造函数.