为什么C++的设计使得在同一行上声明两个int*的正确方法是
int *x, *y;
Run Code Online (Sandbox Code Playgroud)
不
int* x,y;
Run Code Online (Sandbox Code Playgroud)
我知道有些人认为你应该避免使用任何形式并在自己的行上声明每个变量,但我对为什么做出这个语言决定感兴趣.
我有一个头文件port.h,port.c和我的main.c
我收到以下错误:'ports'使用未定义的struct'port_t'
我想,因为我在.h文件中声明了结构,并且.c文件中的实际结构是可以的.
我需要有前向声明,因为我想在port.c文件中隐藏一些数据.
在我的port.h中,我有以下内容:
/* port.h */
struct port_t;
Run Code Online (Sandbox Code Playgroud)
port.c:
/* port.c */
#include "port.h"
struct port_t
{
unsigned int port_id;
char name;
};
Run Code Online (Sandbox Code Playgroud)
main.c中:
/* main.c */
#include <stdio.h>
#include "port.h"
int main(void)
{
struct port_t ports;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
非常感谢任何建议,
除非我做错了.我们似乎无法做到这样的事情:
var x;
x = 1;
Run Code Online (Sandbox Code Playgroud)
在Scala中,但您必须声明并为其赋值.为什么会出现这种情况有什么理由吗?
什么是声明的返回值/类型int i = 5?
为什么不编译这段代码:
#include <iostream>
void foo(void) {
std::cout << "Hello";
}
int main()
{
int i = 0;
for(foo(); (int i = 5)==5 ; ++i)std::cout << i;
}
Run Code Online (Sandbox Code Playgroud)
虽然这样做
#include <iostream>
void foo(void) {
std::cout << "Hello";
}
int main()
{
int i = 0;
for(foo(); int i = 5; ++i)std::cout << i;
}
Run Code Online (Sandbox Code Playgroud) 可能重复:
C++应该删除头文件吗?
在像C#和Java这样的语言中,没有必要在使用它之前声明(例如)一个类.如果我理解正确,这是因为编译器对代码进行了两次传递.在第一个中它只是"收集可用信息",在第二个中它检查代码是否正确.
在C和C++中,编译器只进行一次传递,因此当时所有东西都需要可用.
所以我的问题基本上就是为什么不用C和C++这样做.它不会消除头文件的需求吗?
我们可以在函数内声明函数(我想要一个局部变量,但它作为函数声明解析):
struct bvalue;
struct bdict {
bdict(bvalue);
}
struct bvalue {
explict operator bdict() const;
}
struct metainfo {
metainfo(bdict);
}
void foo(bvalue v) {
metainfo mi(bdict(v)); // parses as function declaration
metainfo mi = bdict(v); // workaround
// (this workaround doesn't work in the presence of explicit ctors)
}
Run Code Online (Sandbox Code Playgroud)
唯一的原因是"因为它使解析器变得更简单"和"因为标准是这样说的",还是有一个不明确的用途?
例如,让我们考虑一下static存储类说明符.以下是此存储类说明符的有效和不正确用法的几个示例:
static int a; // valid
int static b; // valid
static int* c; // valid
int static* d; // valid
int* static e; // ill-formed
static int const* f; // valid
int static const* g; // valid
int const static* h; // valid
int const* static i; // ill-formed
typedef int* pointer;
static pointer j; // valid
pointer static k; // valid
Run Code Online (Sandbox Code Playgroud)
(标记为"有效"的声明被Visual C++ 2012,g ++ 4.7.2和Clang ++ 3.1接受.标记为"格式错误"的声明被所有这些编译器拒绝.)
这看起来很奇怪,因为存储类说明符适用于声明的变量.它是声明的变量,而static不是声明的变量的类型.为什么e和i形象k …
码:
const char* const* const* foo(int bar);
Run Code Online (Sandbox Code Playgroud)
我已经看过双锥体,之前也阻止了指针的修改.我第一次见到生命中的三重常数.想知道它的用途是什么.
根据c ++标准,以下程序是否格式良好或格式不正确?
namespace X { int i; }
namespace Y { using X::i; }
int main() { using X::i; using Y::i; }
Run Code Online (Sandbox Code Playgroud)
我用不同的编译器得到了不同的结果:
我不想修复这个程序让它在GCC上编译.我只是想知道c ++标准对此有何看法以及为什么三个编译器的行为不同.此外,我想如果这是任何这些编译器中的错误的结果.