假设我想在我的程序中共享全局数据数组,例如:
int lookup_indexes[] = { -1, 1, 1, -1, 2, 1, 1, -2, 2, 2, -1, 1, 1, 2 };
Run Code Online (Sandbox Code Playgroud)
externC头文件中此数组的正确声明是什么?
那么这样的数组怎么样:
int double_indexes[][5] = { { -1, 1, 1, -1, 1 }, { 2, -2, 2, 1, -1 } };
Run Code Online (Sandbox Code Playgroud)
在我的头文件中我尝试了这个:
extern int lookup_indexes[];
extern int double_indexes[][5];
Run Code Online (Sandbox Code Playgroud)
但这会导致编译器错误:
water.h:5: error: array type has incomplete element type
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚.
谢谢,Boda Cydo.
我有一个我在一些.h文件中声明的枚举:
typedef enum {
NONE,
ONE,
TWO,
THREE
} MYENUM;
Run Code Online (Sandbox Code Playgroud)
在一个单独的.cpp我不能这样做:
extern enum MYENUM; //works
extern MYENUM TWO; //makes sence, TWO is not an INSTANCE of MYENUM...
Run Code Online (Sandbox Code Playgroud)
怎么会这样做而不包括枚举枚举的整个标题?
当在cpp文件中对函数进行外设时,编译器会以不同方式对待这些函数吗?
extern void foo(char * dataPtr);
void foo(char *);
extern void foo(char * );
Run Code Online (Sandbox Code Playgroud)
我很想知道因为我在代码中看到了所有这些并且不确定区别是什么.
我有一个混合C和C++的项目.在C头文件中,我有这样的代码:
typedef struct mystruct* mystruct;
struct mystruct {
// whatever struct needs
};
Run Code Online (Sandbox Code Playgroud)
要在C++文件中使用它,我正在做:
extern "C" {
#include "mystruct.h"
}
Run Code Online (Sandbox Code Playgroud)
所以你看到我正在使用相同的名称创建一个不透明的指针.这在C中很好,但在C++中却没有(因为需要在C中使用struct关键字进行实例化,而不是在C++中实例化).但是,在尝试编译C++代码时出现错误(冲突的声明).我认为使用extern "C"将使编译器将C头视为C,但似乎仍然将它用作C++.对这里发生的事情有什么解释吗?
我理解将单词放在extern头文件中的变量声明之前声明存在一个全局静态变量而不初始化它.我也明白,如果我导入包含extern变量的文件,我可以在没有类/文件名的情况下引用它们.但是,在哪里定义它们及其价值?
我想要做的是创建一个具有全局常量的常量类,我想在整个iOS应用程序的代码中使用它们.
有人把它们放在界面里面吗?
example.h文件
#import <Foundation/Foundation.h>
@interface Constraints : NSObject
{
extern NSString * const PREFS_NAME;
}
Run Code Online (Sandbox Code Playgroud)
或者就像这样放在接口之外
example.h文件
#import <Foundation/Foundation.h>
extern NSString * const PREFS_NAME;
@interface Constraints : NSObject
{
}
Run Code Online (Sandbox Code Playgroud)
然后在实现.m文件中如何初始化extern值?
在这样的实施区域内?
Example.m
#import "Constraints.h"
@implementation Constraints
/**PRefecences name for the application**/
const NSString * PREFS_NAME = @"MyApp_Prefs";
@end
Run Code Online (Sandbox Code Playgroud)
或者在实现区域之外初始化它们,如下所示:
Example.m
#import "Constraints.h"
/**PRefecences name for the application**/
const NSString * PREFS_NAME = @"MyApp_Prefs";
@implementation Constraints
@end
Run Code Online (Sandbox Code Playgroud)
或者我在构造函数中提供它们的初始值?或者+在它前面的一些任意的静态样式方法,即+(void) setAppConstraints;
我尝试了几种组合,但总是遇到错误,例如"使用不同类型重新定义'xVariable'".或者关于"extern没有初始化界面"的东西(或类似的东西,我忘了).所以我想知道如何正确地声明和初始化它们以形成与 …
我创建了自己std::cout的对象,它既可以写入std::cout日志文件,也可以写入日志文件.
我目前正在头文件中定义它,但我收到了未使用的变量警告.
头文件 <MyLib/Log.h>
static LOut { };
static LOut lo;
template<typename T> inline LOut& operator<<(LOut& mLOut, const T& mValue)
{
std::string str{toStr(mValue)};
std::cout << str;
getLogStream() << str;
return mLOut;
}
Run Code Online (Sandbox Code Playgroud)
用法:
#include <MyLib/Log.h>
...
lo << "hello!" << std::endl;
Run Code Online (Sandbox Code Playgroud)
应该lo是static?应该lo是extern?
Kudos用于解释声明类似cout对象的正确方法,并展示主标准库实现如何实现它.
编辑:by- coutlike对象,我的意思是一个全局变量,在包含相应的头之后始终可用.
我正在尝试创建一个简单的C++测试应用程序,基于Qt 5.1配置KMS功能测试(qtbase/config.tests/qpa/kms),这是失败的.应用程序非常简单,如下所示:
#include <stdlib.h>
extern "C" {
#include <gbm.h>
#include <xf86drmMode.h>
#include "xf86drm.h"
}
#include <EGL/egl.h>
#include <GLES2/gl2.h>
int main(int, char **)
{
// Check for gbm_surface which is quite a recent addition.
gbm_surface *surface = 0;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
问题是当包含"libdrm/xf86drmMode.h"或"libdrm/xf86drm.h"时,还包括"drm/drm.h".在"drm.h"中,有一个结构定义为:
struct drm_buf_map {
int count; /**< Length of the buffer list */
void *virtual; /**< Mmap'd area in user-virtual */
struct drm_buf_pub *list; /**< Buffer information */
};
Run Code Online (Sandbox Code Playgroud)
注意drm_buf_map结构中名为"virtual"的变量.这会导致C++编译器错误,使用extern"C"无法解决.这是有道理的,但我不知道如何解决这个问题(除了使用C编译器).是否有编译器标志来处理这个?
谢谢!
我想从kernel32.dll导入一些函数,但我想使用不同的名称.功能示例:
[DllImport("kernel32.dll")] private static extern bool ReadProcessMemoryProc64 (...);
private static bool BetterReadableAndWriteableName (...) {
ReadProcessMemoryProc64(...);
}
Run Code Online (Sandbox Code Playgroud)
如果有另一种方式,包装该功能是我实际上不想要的.
此代码将编译并在当前 C 标准下定义良好:
static int foo(int);
extern int foo(int);
Run Code Online (Sandbox Code Playgroud)
该标准规定,在这种情况下(C11:6.2.2 标识符的链接(p4)):
对于在该标识符的先前声明可见的范围内使用存储类说明符 extern 声明的标识符,31) 如果先前声明指定内部或外部链接,则后面声明中标识符的链接与先前声明中指定的链接。[...]
...这意味着该int foo(int)函数已声明static int foo(int)。
像这样交换这些声明:
extern int foo(int);
static int foo(int);
Run Code Online (Sandbox Code Playgroud)
...使用 GNU GCC 给我一个编译器错误:
'foo' 的静态声明遵循非静态声明
我的问题是:第二种情况是一个错误并且没有以与第一种情况类似的方式处理的设计原理是什么?我怀疑这与单独的翻译单元更易于管理和#include? 我觉得如果不理解这一点,我可以在未来的 C 项目中为一些错误敞开心扉。
根据C++ Primer,我们可以为定义为 extern 的变量提供初始值设定项,但这样做会覆盖 extern。具有初始值设定项的 extern 是一个定义:
extern double pi = 3.1416; // definition
Run Code Online (Sandbox Code Playgroud)
书中还指出,在函数内部为 extern 提供初始值设定项是错误的。在我看来,这两个陈述加在一起有点令人困惑,它们在我脑海中引起了以下问题:
如果在任何函数外部的 extern 上提供初始化程序可以覆盖 extern,为什么不能在函数内部的 extern 上提供它?
我也不明白为什么有人想要获得添加 extern 关键字的声明并提供初始值设定项。这与定义变量并为其提供初始化程序不一样吗?如果不是,为什么?答案是我们不能在函数内部为 extern 提供初始值设定项的原因吗?