我想弄清楚的是,如果像这样的东西(用C语写):
#define FOO 15
#define BAR 23
#define MEH (FOO / BAR)
Run Code Online (Sandbox Code Playgroud)
被允许?我希望预处理器替换每个实例
MEH
Run Code Online (Sandbox Code Playgroud)
同
(15 / 23)
Run Code Online (Sandbox Code Playgroud)
但我不太确定它会起作用.当然,如果预处理器只通过代码一次,那么我认为它不会按照我想要的方式运行.
我找到了几个类似的例子,但所有这些都让我理解得太复杂了.如果有人能帮我解决这个简单的问题,我将永远感激不尽!
我知道一个数组衰减到指针,如果一个声明
char things[8];
Run Code Online (Sandbox Code Playgroud)
然后在things
其他地方使用,things
是一个指向数组中第一个元素的指针.
另外,根据我的理解,如果有人宣称
char moreThings[8][8];
Run Code Online (Sandbox Code Playgroud)
那么moreThings
它不是指向char的类型指针,而是类型为"指向char的指针数组",因为衰减只发生一次.
什么时候moreThings
传递给一个函数(比如说原型void doThings(char thingsGoHere[8][8])
实际上是什么进行了堆栈?
如果moreThings
不是指针类型,那么这仍然是一个传递引用?我想我一直认为它moreThings
仍然代表了多维数组的基地址.如果doThings
接受输入thingsGoHere
并将其传递给另一个函数会怎么样?
规则几乎是除非指定数组输入,const
然后数组将始终可修改?
我知道类型检查的东西只发生在编译时,但我仍然对技术上作为一个引用传递的东西感到困惑(即只有当传递类型指针的参数时,或者指针数组是否为传递 - 参考也是?)
很抱歉这个问题在这个地方有点儿,但由于我很难理解这一点,很难说出一个精确的询问.
我正在编写一个嵌入式应用程序,不幸的是,我使用的环境目前还没有C++ 11支持.
我需要实现一个哈希/无序映射(std::map
由于性能原因,常规方法不会这样做),但似乎无法找到干净利落的方法.
如果没有实际引入整个库,Boost不想工作.甚至hash_map
来自SGI 的原始STL也需要多个标头,并重复标准库功能,导致模糊的函数调用.这真是一团糟.
为了便于实现,版本控制,质量控制,V&V等,我真的需要利用现有标准库的东西,并且只存在于几个头文件中,我可以将它放在与所有其他源/头文件相同的文件夹中.这样的事情存在,还是我没有希望?我已经搜索了很长一段时间,但空手而归.
非常感谢您的帮助.如果有必要,我当然可以进一步澄清.
我知道在C中,数组不应该是动态大小的.
考虑到这一点,是否允许以下代码?(试图声明一个字符数组与double的长度相同.)
char bytes[sizeof(double)];
Run Code Online (Sandbox Code Playgroud)
我的猜测是sizeof
在程序执行期间对其参数进行操作,所以这是不允许的,但我不确定.
另外,如果这是C++而不是C,会有区别吗?
据我所知,在C++ 11之前,在构造函数初始化列表中初始化成员数组的唯一方法是执行以下操作:
MyClass::MyClass(int arg) : member(arg), memberArray() {
// anything else that needs to be done in the c'tor
}
Run Code Online (Sandbox Code Playgroud)
但是,我有几个人告诉我他们对这个方法不屑一顾,并且for
在构造函数体的循环中零初始化它可能更安全/更可读.
我还没有C++ 11支持,所以我不能使用初始化列表,等等.有没有人听说过的任何指导方针不鼓励在构造函数初始化列表中初始化成员数组?
此外,测试表明没有,但是对于多维数组使用这种语法应该没有任何问题,对吗?(例如,这不是某些编译器由于某种原因而搞砸的标准的一部分......)
我并不是说这是一个主观问题 - 我只是想知道是否有充分的理由使用/不使用上述语法.
非常感谢任何帮助.
c++ arrays coding-style multidimensional-array initialization-list