标签: declaration

在perl中检测声明的包变量

特定

# 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::PeekB可以区别对待.

variables perl declaration

9
推荐指数
1
解决办法
386
查看次数

C++翻译单元的语法

我很长一段时间以来的理解是,在预处理器运行之后,C++转换单元是一系列声明(让我提醒任何定义也是一个声明).

很多人都赞同这个说法,但没有人给出反例.但我自己发现这个让我烦恼的例子:

int x;       //declaration

;            // ??? EMPTY DECLARATION?

int main()   //dec
{            //la
}            //ration
Run Code Online (Sandbox Code Playgroud)

这与MSVC和在线照片很好地编辑.我知道标准定义了一个空语句,但我从未听说过空声明.所以,我看到三个选择:

  • 我的理解是正确的,标准定义了一个空声明
  • 我的理解是正确的,但标准没有定义空声明,上面的翻译是不正确的
  • 我的理解是不正确的,即C++ TU不是一系列声明

请帮我解除疑惑.谢谢

c++ grammar declaration

9
推荐指数
2
解决办法
1295
查看次数

*未指定*在C++ typedef语句中的含义是什么?

我看到像这样的陈述

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标准吗?

c++ typedef declaration c++11

9
推荐指数
2
解决办法
3226
查看次数

在GHCi提示符下的声明

我刚刚安装了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)

为什么?我检查了答案,我是对的.这个问题与等号有什么关系?

syntax haskell declaration ghci

9
推荐指数
1
解决办法
708
查看次数

在c标准库中定义了stdin?

我在stdio.h中找到了这一行:

extern struct _IO_FILE *stdin;
Run Code Online (Sandbox Code Playgroud)

基于这个'extern'关键字,我认为这只是一个声明.我想知道stdin在哪里定义和初始化?

c stdin declaration definition standard-library

9
推荐指数
1
解决办法
7313
查看次数

在Objective-C中使用C++,如何修复"冲突声明'typedef int BOOL'"?

我在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

谢谢你的指导!

c++ typedef declaration objective-c objective-c++

9
推荐指数
1
解决办法
4923
查看次数

C函数在多个源文件中的声明和定义

这是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 declaration

9
推荐指数
1
解决办法
1483
查看次数

在类本身中创建一个类的实例

我是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)

我知道代码的第二部分无法通过编译.但我想知道原因.

它与内存分配或语法规则有关吗?

如果有人能解决我的问题,我将不胜感激.

c++ declaration

9
推荐指数
3
解决办法
3029
查看次数

C typedef const参数

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)

c typedef declaration

9
推荐指数
1
解决办法
470
查看次数

我如何解释这个似乎是函数声明的声明,但不适合通常的模具?

我试图从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没有真正得到任何结果.所以,如果这是一个骗局,我会很高兴它被关闭.

c declaration function function-declaration

9
推荐指数
1
解决办法
222
查看次数