这个问题是针对这里的非英语人士.
它有点偏颇,因为SO是一个"讲英语"的网络论坛,所以...另一方面,大多数开发人员都会知道英语......
在您的语言环境中,技术词汇是否已翻译成语言环境?例如,当IT使用时,"设计模式",或"工厂",或者用德语,西班牙语等编写/说过的内容如何?英语单词是首选吗?当地翻译?这两个版本(英语/语言环境)是否均匀使用?
你能用你的答案写下"设计模式"的语言环境翻译吗?
据维基百科(Wikipedia.fr)称,在法语中,它是"Patron de conception",后者被翻译为"概念化模型"(我猜).
在 C 中,大多数声明结构体的代码将遵循以下模式:
/* struct forward-declaration */
typedef struct T T ;
/* struct definition */
typedef struct T
{
/* etc. */
} T ;
Run Code Online (Sandbox Code Playgroud)
这是非常普遍的,大多数与我交谈过的开发人员甚至都不知道上面的代码同时做了两件事(结构声明,然后在正常命名空间中为结构名称设置别名),只是出于习惯而编写它。
在 C++ 中,该问题得到缓解,因此您可以省略 typedefing 部分。在 C# 和 Java 中,设计人员甚至都没有打扰。所以这些语言无助于理解为什么 C 会这样做。
所以,在Oliver Charlesworth的建议之后:
是否有技术原因struct T将名称空间与其他普通标识符分开?
C89/C90标准中的相关部分是:
6.1.2.3 标识符的命名空间
在翻译单元中的任何一点都可以看到多个特定标识符的声明。句法上下文消除了指代不同实体的用法的歧义。因此。不同类别的标识符有单独的名称空间,如下所示:
[...]
结构、联合和枚举的标签(通过跟随任何关键字struct、union或enum 来消除歧义)。
[...]
所有其他标识符。称为普通标识符(在普通声明符中声明或作为枚举常量声明)。
C11(n1570:6.2.3 标准草案)的文本大致相同。
我正在尝试使用jquery的滑块,似乎没有任何事情发生
任何想法为什么?
<html>
<head>
<script src="jquery-1.4.2.min.js"></script>
<script src="jquery-ui.js"></script>
<style type="text/css">
#myslider { width: 200px; height: 200px; padding: 0.5em; float: left; margin: 10px; background: blue }
</style>
<SCRIPT type=text/javascript>
$(function() {
$("#myslider").slider();
});
</SCRIPT>
</head><body>
<div id="myslider"></div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud) 源代码(在问题的最后)将引发我认为是Solaris Studio上的错误错误(而不是其他编译器).
为清楚起见,使用新行重新格式化了错误消息:
"overload.cpp", line 44: Error:
runGenEntries<std::vector<int>>(const GenEntryRuleDriven<int>&, const std::vector<int>&)
and
runGenEntries<std::vector<int>>(const GenEntryRulesDriven<int>&, const std::vector<int>&)
have same extern name
"__1cNrunGenEntries4nDstdGvector4Cin0AJallocator4Ci_____6FrkTArk1_v_".
1 Error(s) detected.
Run Code Online (Sandbox Code Playgroud)
注意两个函数runGenEntries的第一个参数如何只有一个字符(规则末尾的's')
当第一个参数是类型时,似乎会发生这种情况:
const typename GenEntryRulesDrivenType<typename InputsType::value_type>::type
Run Code Online (Sandbox Code Playgroud)
并且当第一个参数而不是类型时不会发生:
const typename GenEntryRulesDriven<typename InputsType::value_type>
Run Code Online (Sandbox Code Playgroud)
最终解决了相同的类型!
这是仅在Solaris上实现的一些模糊的C++规则的结果吗?或者,当它破坏符号时,这是一个Solaris Studio错误吗?
以下源代码可以在任何编译器上编译.
定义将激活引发错误的代码,或者激活应该产生相同结果的代码(但这次没有错误):
#include <iostream>
#include <vector>
template<typename T>
struct GenEntryRulesDriven
{
void foo() const
{
}
};
template<typename T>
struct GenEntryRuleDriven
{
void bar() const
{
}
std::string toto; // to have a different size than GenEntryRulesDriven
};
template <typename T> …Run Code Online (Sandbox Code Playgroud) 简介: C#/ .NET应该是垃圾回收.C#有一个析构函数,用于清理资源.当一个对象A被垃圾收集在同一行我试图克隆其变量成员之一时会发生什么?显然,在多处理器上,有时,垃圾收集器赢了......
问题
今天,在关于C#的培训课程中,老师向我们展示了一些仅在多处理器上运行时才包含错误的代码.
我将总结一下,有时候,编译器或JIT通过在从被调用方法返回之前调用C#类对象的终结器来搞砸.
在Visual C++ 2005文档中给出的完整代码将作为"答案"发布,以避免提出非常大的问题,但基本要点如下:
以下类具有"Hash"属性,该属性将返回内部数组的克隆副本.在构造中,数组的第一项值为2.在析构函数中,其值设置为零.
关键是:如果你试图得到"示例"的"哈希"属性,你将获得一个干净的数组副本,其第一个项目仍然是2,因为正在使用该对象(因此,不是垃圾收集/定稿):
public class Example
{
private int nValue;
public int N { get { return nValue; } }
// The Hash property is slower because it clones an array. When
// KeepAlive is not used, the finalizer sometimes runs before
// the Hash property value is read.
private byte[] hashValue;
public byte[] Hash { get { return (byte[])hashValue.Clone(); } }
public Example()
{
nValue = 2;
hashValue = new byte[20]; …Run Code Online (Sandbox Code Playgroud) 我正在写一个程序,我有以下问题:
char *tmp;
sprintf (tmp,"%ld",(long)time_stamp_for_file_name);
Run Code Online (Sandbox Code Playgroud)
有人可以解释为字符串tmp分配多少内存.
有多少个字符是长变量?
谢谢,
我还希望能够获得有关此类信息的详尽资源.
谢谢
更新:
使用您的示例我遇到了以下问题:
root@-[/tmp]$cat test.c
#include <stdio.h>
int
main()
{
int len;
long time=12345678;
char *tmp;
len=snprintf(NULL,0,"%ld",time);
printf ("Lunghezza:di %ld %d\n",time,len);
return 0;
}
root@-[/tmp]$gcc test.c
root@-[/tmp]$./a.out
Lunghezza:di 12345678 -1
root@-[/tmp]$
Run Code Online (Sandbox Code Playgroud)
所以snprintf的len结果是-1,我使用标准编译器在Solaris 9上编译.
请帮我!
我回顾了下面的代码类型,虽然我对问题(*)有个人答案,但我希望得到C++ /设计专家的意见.
出于某种原因,Data对象具有不可修改的标识符和可修改的值:
class Data
{
const Id m_id ; // <== note that m_id is a const member variable
Value m_value ;
Data(const Id & id, const Value & value) ;
Data(const Data & data) ;
Data & operator = (const Data & data) ;
// etc.
} ;
Run Code Online (Sandbox Code Playgroud)
设计选择成为语言选择,因为标识符是const在类级别(**)声明的,以避免它(意外)修改甚至从类成员函数内部...
...但正如您所看到的,有一个复制赋值运算符,其实现方式如下:
Data & Data::operator = (const Data & that)
{
if(this != &that)
{
const_cast<Id &>(this->m_id) = that.m_id ;
this->m_value = that->m_value ;
}
return …Run Code Online (Sandbox Code Playgroud) 我尽量避免在我的C++中使用"使用命名空间"来避免污染我的命名空间.但是,我想利用boost赋值运算符来做这样的事情:
std::vector tmp; tmp += "abc","def","asdf","foo","blah","dfkef";
不添加"using namespace boost :: assign;" 这会产生错误:
error: no match for 'operator+=' in 'tmp += "abc"'
有没有办法在不使用命名空间的情况下在boost中使用这些运算符?
假设我有一个C#类型:
class MyType<T>
{
T Value { get; set; }
// etc.
}
Run Code Online (Sandbox Code Playgroud)
还有一些特殊的类型:
class MyTypeString : MyType<string>
{
// etc.
}
class MyTypeDate : MyType<Date>
{
// etc.
}
Run Code Online (Sandbox Code Playgroud)
我想编写一个通用的功能,我就能操纵(甚至创建)类型的对象MyTypeString或MyTypeDate,并在同一时间返回/修改底层类型值(string或Date).
我目前的解决方案是这样的:
T_Underlying Foo<T, T_Underlying>(ref T p_variable, T_Underlying p_value)
where T : MyType<T_Underlying>, new()
{
if(p_variable == null)
{
p_variable = new T() ;
}
p_variable.Value = p_value ;
return p_value ;
}
Run Code Online (Sandbox Code Playgroud)
但是这个解决方案对我来说太冗长了,因为调用方法,我需要提供所有类型,包括主体和底层类型:
MyTypeString myTypeString = null ;
string value ; …Run Code Online (Sandbox Code Playgroud) 上下文:当出现以下问题时,我正在讨论C#与Java的工作,我想知道如何(或者如果)在C++中优雅地解决它.
比方说,你有两个类A和B(其细节并不重要),然后有两只模板类G和H描述是这样的:
template <typename T> | template <typename T>
class G | class H
{ | {
public : | public :
T * foo() ; | virtual T * foo() = 0 ;
// etc. | // etc.
} ; | } ;
Run Code Online (Sandbox Code Playgroud)
然后我们有类C和D描述如下:
class A { /* ... */ } ;
class B { /* ... */ } ;
class C : public G<A>, public G<B> …Run Code Online (Sandbox Code Playgroud) c++ ×4
c ×2
c# ×2
namespaces ×2
.net ×1
boost ×1
const-cast ×1
finalization ×1
generics ×1
javascript ×1
jquery ×1
locale ×1
oop ×1
operators ×1
slider ×1
solaris ×1
templates ×1