小编Jav*_*Man的帖子

Foreground Vs活动窗口

在Windows中,前台窗口和活动窗口有什么区别?具体而言,前景窗口在什么情况下不能成为活动窗口?如果2个术语指的是相同的概念,为什么有2个术语.

这里的msdn文档提到"单击一个窗口,或者使用ALT+ TABALT+ ESC组合键"使窗口处于活动状态和前景.没有明确说明2个术语之间的区别.检查MSDN.

winapi window foreground

39
推荐指数
2
解决办法
2万
查看次数

64位应用程序和内联汇编

我正在使用Visual C++ 2010开发32位Windows应用程序.有一些我真的想要使用内联汇编.但我刚刚意识到Visual C++不支持64位应用程序中的内联汇编.因此,将来移植到64位是一个大问题.

我不知道64位应用程序与32位应用程序有何不同.是否有可能在未来将32位应用程序全部升级到64位?我听说64位CPU有更多的寄存器.由于性能不是我的应用程序的问题,使用这些额外的寄存器不是我的问题.32位应用程序是否需要升级到64位还有其他原因吗?与32位应用程序相比,64位应用程序处理的方式是否有所不同,除了64位应用程序可能使用64位CPU独有的寄存器或指令?

我的应用程序需要与其他操作系统组件进行交互,例如驱动程序,我知道它必须是64位窗口中的64位.我的32位应用程序是否与它们兼容?

c++ windows 64-bit inline-assembly visual-c++

27
推荐指数
3
解决办法
3万
查看次数

创建虚拟USB设备

我是一个学习如何为USB设备编写WDM设备驱动程序的新手,发现可用的材料太难理解了(DDK在线文档是最难读的,而且Oney的WDM设备驱动程序书不是'更好的事情).

所以,我有一个简单的问题.如果我想创建一个虚拟USB设备(例如,一个看起来像是连接到USB端口的真正USB鼠标的虚拟USB鼠标)进行测试/学习,我该从哪里开始.

到目前为止,我所理解的是HIDClass驱动程序(hidclass.sys)有一个用于usb总线(hidusb.sys)的微型驱动程序,它执行连接的USB硬件的枚举.因此,如果我想劫持硬件枚举过程并创建我自己的虚拟硬件,我是否应该在某处包含一个过滤器驱动程序来拦截与硬件枚举过程相关的一些IRP?

很抱歉,如果上述内容完全没有意义,因为我还处于学习阶段,这实际上是我认为可以帮助我学习更好地编写USB设备驱动程序的练习之一.

usb drivers device

19
推荐指数
2
解决办法
8万
查看次数

C++编译器如何合并相同的字符串文字

编译器(MS Visual C++ 2010)如何在不同的cpp源文件中组合相同的字符串文字?例如,如果我分别在src1.cpp和src2.cpp中有字符串文字"hello world \n".编译的exe文件在constant/readonly部分中可能只有1个"hello world"字符串文字.这个任务是由链接器完成的吗?

我希望实现的是我得到了一些用汇编编写的模块供C++模块使用.这些汇编模块包含许多长字符串文字定义.我知道字符串文字与C++源代码中的其他字符串文字相同.如果我将我的程序集生成的obj代码与编译器生成的obj代码链接,那么这些字符串文字是否会被链接器合并以删除冗余字符串,就像所有模块都在C++中一样?

c++ compiler-construction linker visual-c++

15
推荐指数
1
解决办法
2552
查看次数

C++预处理程序标准行为

我正在研究关于预处理器的确切行为的C++标准(我需要实现某种类型的C++预处理器).根据我的理解,我在下面编写的示例(以帮助我的理解)应该是有效的:

#define dds(x) f(x,
#define f(a,b) a+b
dds(eoe)
su)
Run Code Online (Sandbox Code Playgroud)

我希望像宏调用这样的第一个函数dds(eoe)被替换为f(eoe,(注意替换字符串中的逗号),然后f(eoe,su)在重新扫描输入时将其视为.

但VC++ 2010测试给了我这个(我告诉VC++输出预处理文件):

eoe+et_leoe+et_l
su)
Run Code Online (Sandbox Code Playgroud)

这是违反直觉的,显然是不正确的.它是VC++ 2010的一个错误还是我对C++标准的误解?特别是,像我一样在替换字符串的末尾添加逗号是不正确的吗?我对C++标准语法的理解是,任何preprocessing-token人都可以在那里使用.

编辑:

我没有GCC或其他版本的VC++.有人可以帮我验证这些编译器.

c++ preprocessor visual-c++ compiler-bug c-preprocessor

15
推荐指数
2
解决办法
525
查看次数

理解C++ 03运算符重载的标准语法

重载运算符的标准C++ 03语法如下:

operator-function-id:
运算 运算
运算 < template-argument-list?>

第一个是我们通常使用的普通运算符重载语法,例如

Myclass operator + (Myclass s) {...}
Run Code Online (Sandbox Code Playgroud)

但第二种选择意味着什么呢?特别是,在什么情况下我们使用template-argument-list?在快速浏览一下C++ 11之后,我发现第二种形式已经从标准中删除了.它的初衷是什么?

编辑:使用VC++ 2010测试后,下面是使用上述语法的一种方法,虽然它对我没有多大意义:

class K {
public:
    int a;
    template <int B>
    int operator + (int b) {
        return a+b+B;
    }
};


int _tmain(int argc, _TCHAR* argv[])
{
    K k;
    k.a=1;
    int s;
    s=k.operator+<115>(2);
    printf("%d\n",s);
    return 0;

}

output:118
Run Code Online (Sandbox Code Playgroud)

c++ language-lawyer c++03

14
推荐指数
1
解决办法
220
查看次数

为什么标准C++语法不能涵盖这种情况?

我主要是指C++ 03标准,但是,在快速浏览之后,它也应该适用于C++ 11标准.

以下代码在VC++ 2010中成功编译和执行:

template<typename T> 
class CC { 
  public: 
    T f(T a) { 
            return a*a;
    } 
};
template<> 
class ::CC<int> {  //<--- ::CC<int> syntax allowed by VC++2010, but is it non-standard ?
  public: 
    int f(int a) { 
            return a*a;
    } 
};

int main(int argc, _TCHAR* argv[])
{
    ::CC<int> c;
}
Run Code Online (Sandbox Code Playgroud)

请注意::CC<int>语法以引用全局命名空间中定义的模板.这NamespaceA::CC<int>::运算符前面的语法不同.使用其他一些工具,我试图使用C++ 03中的语法严格解析它,但它给了我错误,在我看来标准只接受NamespaceA::CC<int>类头声明中的表单.

仔细看看,问题在于class-head标准中的语法定义:

class-head:
   class-key identifier(optional) base-clause(optional)
   class-key nested-name-specifier identifier base-clause(optional)
   class-key nested-name-specifier(optional) template-id base-clause(optional)
Run Code Online (Sandbox Code Playgroud)

而且由于nested-name-specifier形式 …

c++ grammar language-lawyer c++11 c++03

7
推荐指数
1
解决办法
350
查看次数

在ANTLR中匹配多个Lexer规则的字符

我已经定义了多个可能匹配相同字符序列的词法规则.例如:

LBRACE:  '{' ;
RBRACE: '}' ;
LPARENT: '(' ;
RPARENT: ')' ;
LBRACKET: '[' ;
RBRACKET: ']' ;
SEMICOLON: ';' ;
ASTERISK: '*'  ;
AMPERSAND: '&'  ;

IGNORED_SYMBOLS:   ('!' | '#' | '%' | '^' | '-' | '+' | '=' | 
                    '\\'| '|' | ':' | '"' | '\''| '<' | '>' | ',' | '.' |'?' | '/'  ) ;


// WS comments*****************************
WS: (' '|'\n'| '\r'|'\t'|'\f' )+ {$channel=HIDDEN;};
ML_COMMENT: '/*' .* '*/' {$channel=HIDDEN;};
SL_COMMENT: '//' .* …
Run Code Online (Sandbox Code Playgroud)

parsing antlr lexer

6
推荐指数
1
解决办法
1787
查看次数

ANTLR4 Lexer匹配行首行行尾

如何在ANLTR4词法分析器中实现Perl正则表达式^和$?即。在不消耗任何字符的情况下匹配行首和行尾。

我正在尝试使用ANTLR4词法分析器在行的开头而不是在行的中间匹配##例如,要隔离并扔掉所有C ++预处理程序指令,而不管它是哪个指令,而忽略a中的#字符串字面量。(通常,我们可以对C ++字符串文字进行标记化,以消除出现在行中间的#,但前提是我们不这样做)。那意味着我只想指定#。*?无需烦扰#if #ifndef #pragma等

同样,C ++标准允许在#eg前后添加空格和多行注释。

   /* helo
world*/  #  /* hel
l
o
*/  /*world */ifdef .....
Run Code Online (Sandbox Code Playgroud)

被认为是有效的预处理器指令,出现在一行上。(ML COMMENTs中的CRLF被扔掉)

这是我目前正在做的:

PPLINE: '\r'? '\n' (ML_COMMENT | '\t' | '\f' |' ')* '#' (ML_COMMENT | ~[\r\n])+ -> channel(PPDIR); 
Run Code Online (Sandbox Code Playgroud)

但是问题是我必须依靠#之前CRLF的存在,并将CRLF与指令一起丢弃。我需要替换该指令行的CRLF扔掉的CRLF,所以我必须确保该指令被CRLF终止。

但是,这意味着我的语法无法处理出现在文件开头的指令(即没有在前面的CRLF)或在没有终止CRLF的情况下在EOF之后出现的指令。

如果可以使用Perl样式的regex ^ $语法,则可以匹配SOL / EOL,而不必显式匹配和使用CRLF。

regex antlr4

5
推荐指数
1
解决办法
3034
查看次数

我们如何解释这个复杂的C++预处理器宏替换

我正在研究关于C++预处理器如何处理宏替换的C++标准(我需要自己实现C++预处理器的一个子集).这是我为学习创建的一个例子:

  #define a x
  #define x(x,y) x(x+a, y+1)

  a(x(90, 80), a(1,2))
Run Code Online (Sandbox Code Playgroud)

通过要求VC++ 2010生成预处理器输出文件,我发现上面的内容a(x(90, 80), a(1,2))变为:

90(90+x, 80+1)(90(90+x, 80+1)+x, 1(1+x, 2+1)+1);
Run Code Online (Sandbox Code Playgroud)

但是预处理器如何提出这个输出呢?规则太复杂,无法理解.有人可以解释预处理器为提出这样的结果所做的所有步骤吗?

c++ macros c-preprocessor

5
推荐指数
1
解决办法
314
查看次数