我读litb提问关于SFINAE 在这里,我想知道到底是什么他的代码声明.下面是一个更简单的(没有模板)示例:
int (&a())[2];
Run Code Online (Sandbox Code Playgroud)
究竟是什么声明?&的作用是什么?为了增加我的困惑,如果我宣布以下内容
int b()[2];
Run Code Online (Sandbox Code Playgroud)
我收到一个关于声明一个返回数组的函数的错误,而第一行没有这样的错误(因此,人们会认为第一个声明不是函数).但是,如果我尝试分配一个
a = a;
Run Code Online (Sandbox Code Playgroud)
我得到一个错误,说我正在尝试分配函数...所以现在它是一个函数.究竟是什么东西?
假设您有一个名为sum.c的源文件,如下所示:
#include "sum.h"
int sum(int x, int y) {
return x+y;
}
Run Code Online (Sandbox Code Playgroud)
将方法的标题包含在自己的定义文件中有什么意义?你不应该只在调用sum函数的源文件中包含它吗?
可能重复:
C++为什么在params中放空?
这两个声明之间有什么区别,哪个更常用?
void function1();
Run Code Online (Sandbox Code Playgroud)
和
void function2( void );
Run Code Online (Sandbox Code Playgroud) 我在单个 .h 文件中有以下类:
class MyClass
{
protected:
MyClass();
~MyClass();
private:
MyClass(const MyClass&);
MyClass& operator=(const MyClass&);
};
inline MyClass::MyClass()
{
}
inline MyClass::~MyClass()
{
}
Run Code Online (Sandbox Code Playgroud)
令我感到困惑的是,没有实现MyClass(const MyClass&)复制构造函数和MyClass& operator=(const MyClass&)赋值运算符重载的代码。这个类只有定义,但没有别的。
我在我正在分析的代码中看到了这一点,并且它编译得很好。我是 C++ 新手,在我见过的所有示例中,我都在类中找到了定义,在下面或单独的 .cpp 文件中找到了实现
那么,任何人都可以解释为什么这段代码会编译,为什么只包含函数的声明而不包含它的实现?
谢谢!!
我一直在使用 PInvoke 让我的 C# 应用程序调用我编写的 C++ 函数。
现在,我到处都听到我需要用__stdcall约定定义那些外部可访问的功能。我的问题是:为什么?
到目前为止,我不小心忽略了这个建议,一切都像魅力一样。当我添加__stdcall到我的函数中时,一切都以相同的方式工作(或者至少看起来如此)。
这篇文章说__stdcall是用于Win32位函数,但我是针对x64平台编译的。这是否意味着我不应该使用__stdcall它,还是意味着我错过了其他东西?
并且请在回复时使用简单的英语。;-) 这样的行(引自我链接的文章):
被调用者清理堆栈,因此编译器使可变参数函数 __cdecl。
让我的大脑感觉有风滚草从里面吹过。
最近我学会了C中的隐式函数声明.主要观点很明确,但我对在这种情况下理解链接过程有些麻烦.
请考虑以下代码(文件ac):
#include <stdio.h>
int main() {
double someValue = f();
printf("%f\n", someValue);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试编译它:
gcc -c a.c -std=c99
Run Code Online (Sandbox Code Playgroud)
我看到关于隐式声明功能的警告f().
如果我尝试编译和链接:
gcc a.c -std=c99
Run Code Online (Sandbox Code Playgroud)
我有一个未定义的引用错误.一切都很好.
然后我添加另一个文件(文件bc):
double f(double x) {
return x;
}
Run Code Online (Sandbox Code Playgroud)
并调用下一个命令:
gcc a.c b.c -std=c99
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,一切都成功连接 当然在./a.out调用后我看到了垃圾输出.
所以,我的问题是:如何将隐式声明函数的程序链接起来?在编译器/链接器的引擎下我的例子会发生什么?
我已下载了一些库,它按以下方式声明了这些函数:
#if !defined(__ANSI_PROTO)
#if defined(_WIN32) || defined(__STDC__) || defined(__cplusplus)
# define __ANSI_PROTO(x) x
#else
# define __ANSI_PROTO(x) ()
#endif
#endif
int httpdAddVariable __ANSI_PROTO((httpd*,char*, char*));
Run Code Online (Sandbox Code Playgroud)
__ANSI_PROTO这里有什么作用?为什么最好简单地声明为
int httpdAddVariable (httpd*,char*, char*);
Run Code Online (Sandbox Code Playgroud) 我在网上考试中发现了这个问题.这是代码:
#include <stdio.h>
int main(void) {
int demo();
demo();
(*demo)();
return 0;
}
int demo(){
printf("Morning");
}
Run Code Online (Sandbox Code Playgroud)
我在测试后看到了答案.这就是答案:
MorningMorning
Run Code Online (Sandbox Code Playgroud)
我看了解释,但不明白为什么这就是答案.我的意思是,这条线不应该int demo();引起任何"问题"吗?
任何解释都有帮助.谢谢.
如果我声明两个函数,a并且b:
def a(x):
return x**2
b = lambda x: x**2
Run Code Online (Sandbox Code Playgroud)
我无法type区分它们,因为它们都属于同一类型.
assert type(a) == type(b)
Run Code Online (Sandbox Code Playgroud)
另外,types.LambdaType没有帮助:
>>> import types
>>> isinstance(a, types.LambdaType)
True
>>> isinstance(b, types.LambdaType)
True
Run Code Online (Sandbox Code Playgroud)
人们可以使用__name__如下:
def is_lambda_function(function):
return function.__name__ == "<lambda>"
>>> is_lambda_function(a)
False
>>> is_lambda_function(b)
True
Run Code Online (Sandbox Code Playgroud)
但是,由于__name__可能已被修改,is_lambda_function因此无法保证返回正确的结果:
>>> a.__name__ = '<lambda>'
>>> is_lambda_function(a)
True
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以产生比__name__属性更可靠的结果?
我对该const功能的一个特定示例感到困惑。因此类型声明声明const :: a -> b->a该函数接受两个类型为aand 的参数b并返回一个类型a。例如:
const 5 3 => 5
const 1 2 => 1
Run Code Online (Sandbox Code Playgroud)
根据声明,这是有道理的。但是,我遇到了这个特定的例子:
const (1+) 5 3 => 4
Run Code Online (Sandbox Code Playgroud)
这让我质疑我对函数声明的理解。我知道这个函数只需要两个参数,因为我试过:
const 1 5 3
Run Code Online (Sandbox Code Playgroud)
现在这让我放心,它只需要 2 个参数。那么这是如何工作的呢?是(1+)不是参数?如果不是,那是什么?
const (1+) 5 3 => 4
Run Code Online (Sandbox Code Playgroud)