特定
# package main;
our $f;
sub f{}
sub g {}
1;
Run Code Online (Sandbox Code Playgroud)
我怎样才能确定$f,但是没有$g宣布?关闭袖口,我认为*{main::g}{SCALAR}可能是未定义的,但它是一个真正的 SCALAR参考.
背景:我想将一个变量导入main::,但是如果已经声明了该变量,则将carp或croak 导入.
编辑添加了一个f子程序来响应@ DVK的初始答案.
答案(2010-07-27)
这并不容易,但有可能.
一种eval技术是最便携的,工作在早于5.10的perls上.在最近的perls中,内省模块喜欢Devel::Peek和B可以区别对待.
我很长一段时间以来的理解是,在预处理器运行之后,C++转换单元是一系列声明(让我提醒任何定义也是一个声明).
很多人都赞同这个说法,但没有人给出反例.但我自己发现这个让我烦恼的例子:
int x; //declaration
; // ??? EMPTY DECLARATION?
int main() //dec
{ //la
} //ration
Run Code Online (Sandbox Code Playgroud)
这与MSVC和在线照片很好地编辑.我知道标准定义了一个空语句,但我从未听说过空声明.所以,我看到三个选择:
请帮我解除疑惑.谢谢
我看到像这样的陈述
typedef*unspecified*value_type;
typedef*unspecified*reference;
在Boost :: multi_array类的声明中.
namespace boost {
template <typename ValueType,
std::size_t NumDims,
typename Allocator = std::allocator<ValueType> >
class multi_array {
public:
// types:
typedef ValueType element;
typedef *unspecified* value_type;
typedef *unspecified* reference;
typedef *unspecified* const_reference;
typedef *unspecified* difference_type;
typedef *unspecified* iterator;
typedef *unspecified* const_iterator;
typedef *unspecified* reverse_iterator;
typedef *unspecified* const_reverse_iterator;
typedef multi_array_types::size_type size_type;
typedef multi_array_types::index index;
typedef multi_array_types::index_gen index_gen;
typedef multi_array_types::index_range index_range;
typedef multi_array_types::extent_gen extent_gen;
typedef multi_array_types::extent_range extent_range;
typedef *unspecified* storage_order_type;
Run Code Online (Sandbox Code Playgroud)
*未指定*在这里意味着什么?这是C++ 11标准吗?
我刚刚安装了Haskell Platform for Windows(版本2011.2.0.1),并开始使用HaskellQuestions.pdf
第二个问题需要"x = 3"作为答案.但是当我把它输入GHCi时,我得到了
GHCi, version 7.0.3: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Loading package ffi-1.0 ... linking ... done.
Prelude> x = 3
<interactive>:1:3: parse error on input `='
Prelude>
Run Code Online (Sandbox Code Playgroud)
为什么?我检查了答案,我是对的.这个问题与等号有什么关系?
我在stdio.h中找到了这一行:
extern struct _IO_FILE *stdin;
Run Code Online (Sandbox Code Playgroud)
基于这个'extern'关键字,我认为这只是一个声明.我想知道stdin在哪里定义和初始化?
我在C++中有很多代码,最初是在PC上构建的.我试图在Mac上使用Objective-C.为此,我创建了一个Objective-C框架来存放C++代码并添加了一个瘦包装器.但是我在C++代码中遇到了typedef问题.
当我在PC上使用C++时,我使用了BOOLWinDef.h中定义的变量.因此,当我将所有内容移到Mac上时,我添加了typedef int BOOL;以确保BOOL变量仍然按预期编译.
但是当我尝试编译时,我得到一个错误:" Conflicting declaration 'typedef int BOOL'".我假设这是因为BOOLObjective-C中的关键字,因此已经定义了.我也不能只使用Objective-C,BOOL因为它是一个unsigned char而不是int.
当我在寻找可能的解决方案时,我找到了一个提到未定义BOOL的解决方案,但是我找不到怎么做(我也不知道它是否真的有效). 另一个建议将 C++文件中的BOOL重命名为非关键字.这个建议对我来说不是一个选择,因为其他项目依赖于C++代码.理想情况下,我所做的任何更改都应保留在一个文件中,或者至少不应对Windows计算机上的代码产生负面影响.
如何为我的C++文件取消定义BOOL的Objective-C定义并使用我添加的C++定义?有没有更好的方法来处理这个问题?
如果它有助于我使用:Xcode 3.2.5,64位和Mac OS X 10.6.6
谢谢你的指导!
这是src1.c的内容:
#include <stdio.h>
extern int w;
//int go(char); // no need to declare here. WHY????
main(){
char a='f';
go(a);
printf("%d\n", w);
}
Run Code Online (Sandbox Code Playgroud)
这是src2.c的内容:
#include <stdio.h>
int w = 99;
int go(char t){
printf("%c\n%d\n",t,sizeof(t));
}
Run Code Online (Sandbox Code Playgroud)
为什么在Linux中编译go函数src1.c后,必须在文件中声明该函数?
cc src1.c src2.c;
Run Code Online (Sandbox Code Playgroud)
编译器是否将go函数的定义放在src2.cmain函数代码上面的文件中,这样就不需要声明了?
我这样做:
#include <stdio.h>
int go(char); // need to declare here, because if not, arguments of go will be promoted to intS and they would conflict with char parameters defined in go. Error is …Run Code Online (Sandbox Code Playgroud) 我是C++的新手并且有一个问题:
比较以下代码:
class Node {
public:
int data;
Node* x;
};
Run Code Online (Sandbox Code Playgroud)
和
class Node {
public:
int data;
Node x;
};
Run Code Online (Sandbox Code Playgroud)
我知道代码的第二部分无法通过编译.但我想知道原因.
它与内存分配或语法规则有关吗?
如果有人能解决我的问题,我将不胜感激.
typedef float vec3[3];
void test(vec3 const vptr) {
*vptr = 1.f; // error: assignment of read-only location
vptr[0] = 1.f; // error: assignment of read-only location
vptr++; // no error
}
Run Code Online (Sandbox Code Playgroud)
是
vec3 const vptr
Run Code Online (Sandbox Code Playgroud)
同样的
const vec3 vptr
Run Code Online (Sandbox Code Playgroud)
对于所有typedef?最后两个之间有什么区别吗?我想
vec3 const vptr <==> float* const vptr // a constant pointer to an object
const vec3 vptr <==> const float* vptr // a pointer to a constant object
??? <==> const float* const vptr // a constant pointer to a …Run Code Online (Sandbox Code Playgroud) 我试图从sqlite3.c中解读这个声明
SQLITE_PRIVATE void (*sqlite3OsDlSym(sqlite3_vfs *, void *, const char *))(void);
Run Code Online (Sandbox Code Playgroud)
似乎它正在声明一个函数,因为随后会有这个
SQLITE_PRIVATE void (*sqlite3OsDlSym(sqlite3_vfs *pVfs, void *pHdle, const char *zSym))(void){
return pVfs->xDlSym(pVfs, pHdle, zSym);
}
Run Code Online (Sandbox Code Playgroud)
然后似乎是对函数的调用
xInit = (sqlite3_loadext_entry)sqlite3OsDlSym(pVfs, handle, zEntry);
Run Code Online (Sandbox Code Playgroud)
和
xInit = (sqlite3_loadext_entry)sqlite3OsDlSym(pVfs, handle, zEntry);
Run Code Online (Sandbox Code Playgroud)
但我无法理解宣言.我突出了我无法理解的东西
SQLITE_PRIVATE void (*sqlite3OsDlSym(sqlite3_vfs *, void *, const char *))(void);
^ ^^^^^^^
Run Code Online (Sandbox Code Playgroud)
我想知道为什么宣言不是这样的
SQLITE_PRIVATE void *sqlite3OsDlSym(sqlite3_vfs *, void *, const char *);
Run Code Online (Sandbox Code Playgroud)
我希望可能有一个类似的问题已经被问到,但是搜索类似的术语(,)并void没有真正得到任何结果.所以,如果这是一个骗局,我会很高兴它被关闭.
declaration ×10
c ×4
c++ ×4
typedef ×3
c++11 ×1
definition ×1
function ×1
ghci ×1
grammar ×1
haskell ×1
objective-c ×1
perl ×1
stdin ×1
syntax ×1
variables ×1