对于我的应用程序中的自然排序,我目前在shlwapi.dll中调用一个名为StrCmpLogicalW的函数.我正在考虑尝试在Mono下运行我的应用程序,但当然我不能拥有这个P/Invoke的东西(据我所知).
是否有可能在某处看到该方法的实现,或者是否有一个好的,干净且高效的C#片段可以做同样的事情?
我的代码目前看起来像这样:
[SuppressUnmanagedCodeSecurity]
internal static class SafeNativeMethods
{
[DllImport("shlwapi.dll", CharSet = CharSet.Unicode)]
public static extern int StrCmpLogicalW(string psz1, string psz2);
}
public class NaturalStringComparer : IComparer<string>
{
private readonly int modifier = 1;
public NaturalStringComparer() : this(false) {}
public NaturalStringComparer(bool descending)
{
if (descending) modifier = -1;
}
public int Compare(string a, string b)
{
return SafeNativeMethods.StrCmpLogicalW(a ?? "", b ?? "") * modifier;
}
}
Run Code Online (Sandbox Code Playgroud)
所以,我正在寻找的是上述类的替代品,它不使用extern函数.
我想在typedef一个模板中添加一个public ,用于指向使用"C"语言链接的函数take-one-argument的指针.
我试过了:
extern "C" {
template <typename return_t_, typename arg1_t_>
struct test
{
typedef return_t_ (*C_fun1_t)(arg1_t_);
};
}
Run Code Online (Sandbox Code Playgroud)
和:
template <typename return_t_, typename arg1_t_>
struct test
{
extern "C" {
typedef return_t_ (*C_fun1_t)(arg1_t_);
}
};
Run Code Online (Sandbox Code Playgroud)
和:
template <typename return_t_, typename arg1_t_>
struct test
{
extern "C" typedef return_t_ (*C_fun1_t)(arg1_t_);
};
Run Code Online (Sandbox Code Playgroud)
没有成功.
我想要完成的是什么?
我有一个使用VS2010 C#构建的简单.NET dll,它暴露了一个类的2个静态成员
public class Polygon
{
public static void Test(int test) {}
public static void Test(List<int> test) {}
}
Run Code Online (Sandbox Code Playgroud)
然后我从VS2010 C++创建了一个Console应用程序,并在_tmain上面添加了这个函数
extern "C" void TestMe()
{
Polygon::Test(3);
}
Run Code Online (Sandbox Code Playgroud)
添加引用和编译会给我这个错误
1>WierdError.cpp(9): error C2526: 'System::Collections::Generic::List<T>::GetEnumerator' : C linkage function cannot return C++ class 'System::Collections::Generic::List<T>::Enumerator'
1> with
1> [
1> T=int
1> ]
1> WierdError.cpp(9) : see declaration of 'System::Collections::Generic::List<T>::Enumerator'
1> with
1> [
1> T=int
1> ]
1> WierdError.cpp(9) : see reference to class generic instantiation 'System::Collections::Generic::List<T>' being compiled
1> with …Run Code Online (Sandbox Code Playgroud) 为什么合法?
extern int foo = 0xF00; // Gets a warning, still compiles
extern void bar() { // No warning
int x;
}
Run Code Online (Sandbox Code Playgroud)
是否有理由允许这样做?
我们在LCD.c中有这个声明:
unsigned char LCD[8][64] = {((unsigned char) 0)};
Run Code Online (Sandbox Code Playgroud)
在LCD.h中我们希望有类似的东西:
extern unsigned char LCD[][];
Run Code Online (Sandbox Code Playgroud)
我们收到此错误:
Error[Pe098]: an array may not have elements of this type
Run Code Online (Sandbox Code Playgroud) 有些来源(书籍,在线资料)解释了extern如下用法:
extern int i; // declaration - has 'extern'
int i = 1; // definition - specified by the absence of 'extern'
Run Code Online (Sandbox Code Playgroud)
并且有些源支持以下语法:
extern int i; // declaration
extern int i = 1; // definition - specified by the equal sign
// Both marked with 'extern'
Run Code Online (Sandbox Code Playgroud)
我的问题是-这是一个ç与C++的区别,或者是一个预ANSI与ANSI的做法?
现在,更实际的问题:
使用第二种语法,我想创建一个全局对象(从每个编译单元可见).构造函数不带参数,因此无论是括号还是等号都不是必需的.
extern MyClass myobject;
Run Code Online (Sandbox Code Playgroud)
现在,编译器如何区分声明和定义?
编辑:回到学校,我习惯了第一种语法(Borland C).后来我使用了一个编译器(可能是GCC的一些古老版本)拒绝编译没有'extern'的定义.这让我感到困惑.
在C中,当外部变量以相同的成本服务于其目的时,静态存储类的用途是什么.两者都占用了可执行文件数据段中的存储空间.
我有更好的外部变量范围.如果我希望外部变量的范围是特定文件我不要声明这个变量else where.i看到很多灵活性与全局变量静态局部变量
如果我们有变量的地址,我们可以引用函数外部的局部静态变量.本地静态变量的存储将在数据段中不在函数的堆栈框架中.所以静态存储类带来的独特特性表.
我只是想知道静态是否有任何我不知道的微妙目的.
我经常要用10多个源文件编写c/c ++程序,其中需要在所有文件的函数之间共享少量变量.我之前已经读过,通常很好的做法是避免使用全局变量extern.但是,如果完全有必要使用全局变量,则此链接提供了一个很好的策略.最近,我一直在研究将所有变量包装在结构或类中并将此结构传递给不同函数的策略.我想知道人们认为哪种方式更清洁,以及是否有更好的选择.
编辑:我意识到两种语言的策略可能不同.我对仅适用于一种语言或两者兼有的策略感兴趣.
// case 1
unsigned int add_two_numbers(unsigned char a, unsigned char b);
//case 2
extern unsigned int add_two_numbers(unsigned char a, unsigned char b);
Run Code Online (Sandbox Code Playgroud)
案例1和案例2有什么区别?我从来没有使用extern作为函数原型,而是查看某人的代码(谁比我更有经验)我看到extern总是在声明函数原型时使用.任何人都可以指出请点差异吗?(或者指向我可以找到具体信息的链接).谷歌表示,这与外部联系有关.任何人都能指出一个例子,一个人会工作而另一个人不会吗?
我使用嵌入式C(KEIL),如果它有任何区别.
如果我按值传递一个空变量,即使它没有定义,它是否安全且合规?
我在处理代码,重载时遇到了这个问题|,以便打印向量的内容v:
v | print; // prints the vector v
Run Code Online (Sandbox Code Playgroud)
我在这里的代码对我的作品有g++和clang,即使print是extern没有关联的变量,但我不知道如果我推的标准太远.这是针对c ++ 11/c ++ 14,我想这是用c ++ 17解决的inline变量?
首先,我的初始代码.目标是允许v|print打印矢量等内容.我也有更大的目标,与范围相关,但我会在这里关注这个小例子
struct print_tag_t {};
print_tag_t print;
void operator| (std::vector<int> & x, decltype(print) ) {
for(auto elem : x) {
std::cout << elem << '\n';
}
}
int main() {
std::vector<int> v{2,3,5,7};
v | print;
}
Run Code Online (Sandbox Code Playgroud)
如果我将其移动到标题中,我可以将operator|重载设置为inline.但那怎么样print?我发现我extern可以避免关于重复符号的链接器错误
// print.hh …Run Code Online (Sandbox Code Playgroud)