我有一些相当通用的代码,它使用预处理器宏将某个前缀添加到其他宏上.这是一个简单的例子:
#define MY_VAR(x) prefix_##x
Run Code Online (Sandbox Code Playgroud)
"prefix_"实际上是在别处定义的,因此每次包含文件时它都会有所不同.它运行良好,但现在我有一些代码我想跳过如果其中一个令牌不存在,但这不起作用:
#if defined MY_VAR(hello)
Run Code Online (Sandbox Code Playgroud)
我希望它扩展到的是:
#ifdef prefix_hello
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何.我需要使用MY_VAR()宏来进行扩展,所以我不能只是对名称进行硬编码.(实际上对于一些测试代码,每次测试一堆类时,相同的代码都包含不同的前缀,我想跳过几个类的几个测试.)
这可能与C++预处理器有关吗?
更新:
这里有一些半可编译的代码可以进一步说明问题:(避免将其压缩到下面的注释中)
#define PREFIX hello
#define DO_COMBINE(p, x) p ## _ ## x
#define COMBINE(p, x) DO_COMBINE(p, x)
#define MY_VAR(x) COMBINE(PREFIX, x)
// MY_VAR(test) should evaluate to hello_test
#define hello_test "blah blah"
// This doesn't work
#ifdef MY_VAR(test)
printf("%s\n", MY_VAR(test));
#endif
Run Code Online (Sandbox Code Playgroud) 我见过OpenGL的金属/塑料/水/火/ ...着色器.
然而,它可以呈现毛皮般的东西,比如OpenGL中的填充动物/泰迪熊(我知道这可以使用渲染器/光线追踪器,但我想在OpenGl中进行).
如果你有指向GLSl着色器的指针,请指出我正确的方向.
谢谢!
[我猜测答案是否定的,因为毛皮需要的不仅仅是着色器 - 它几乎需要动态创建几何体 - 但我希望被证明是错误的)]
我有一个十个数字的PHP数组
$arr = array("first" => "1", "second" =>"2", "Third" =>"3", "Fourth" =>"4",
"fifth" =>"5",, "sixth" =>"6", "seventh" =>"7", "eighth" =>"8",
"ninth" =>"9","tenth"="10");
Run Code Online (Sandbox Code Playgroud)
我必须将这些值放在a中<td>,将数组<td>拆分为三个,这样我的td包含第一个td包含aray的前三个值</td>
第二个td包含aray <td>的下三个值</td>
第三个td包含<td>接下来的三个值aray </td>
如果剩下的值少于3,那么它必须在另一个td中说现在我有第十个值所以我的最后一个td必须包含第十个值
我从来没有理解#pragma once什么时候#ifndef #define #endif总是有效的需要.
我已经看到了#pragma comment与其他文件链接的用法,但使用IDE可以更轻松地设置编译器设置.
有哪些其他用法#pragma是有用的,但并不广为人知?
编辑:
我不只是#pragma指令列表之后.也许我应该再多说一下这个问题:
你和你一起写的代码#pragma有用吗?
.
答案一目了然:
感谢所有回答和/或评论的人.以下是我发现有用的一些输入的摘要:
#pragma once或#ifndef #define #endif允许更快地编译大型系统.史蒂夫跳进来支持这一点.#pragma onceMSVC首选,而GCC编译器优化#ifndef #define #endif.因此,应该使用其中之一,而不是两者.#pragma pack了二进制兼容性,而Clifford则反对这一点,因为可移植性和字节序可能存在问题.Evan提供了一个示例代码,Dennis告知大多数编译器会强制执行填充以进行对齐.#pragma warning用来隔离真正的问题,并禁用已经审查过的警告.#pragma comment(lib, header)在不重新设置IDE的情况下轻松移植项目.当然,这不太便携.#pragma message为VC用户提供了一个很好的技巧来输出带有行号信息的消息.詹姆斯更进一步,允许error或warning匹配MSVC的消息,并将适当显示,如错误列表.#pragma region了能够在MSVC中使用自定义消息折叠代码.哇,等等,如果我想发布不使用#pragmas除非必要,该怎么办?
#pragma.荣誉.如果SOers感觉到发布答案的冲动,我会在此列表中添加更多内容.感谢大家!
我正在尝试使用带身份验证的cookie.
此页面一旦进入用户并通过即可运行
<?
if ((!$_POST[username]) || (!$_POST[password])) {
header("Location: show_login.html");
exit;
}
$db_name = "testDB";
$table_name = "auth_users";
$connection = @mysql_connect("localhost", "user", "pass") or die(mysql_error());
$db = @mysql_select_db($db_name, $connection) or die(mysql_error());
$sql = "SELECT * FROM $table_name WHERE username ='$_POST[username]' AND password = password('$_POST[password]')";
$result = @mysql_query($sql, $connection) or die(mysql_error());
$num = mysql_num_rows($result);
if ($num != 0) {
$cookie_name = "auth";
$cookie_value = "ok";
$cookie_expire = "0";
$cookie_domain = "domain.com.au";
setcookie($cookie_name, $cookis_value, $cookie_expire, "/", $cookie_domain, 0);
$display_block = "
<p><strong>Secret …Run Code Online (Sandbox Code Playgroud) 我想以这种格式轻松验证日期,只有这种格式.任何otehr格式都应视为无效.
我想要一个UTF8排序规则来支持:
是否UTF8_GENERAL_CI支持所有这些语言?
有没有办法从类中的"私有"函数调用"公共"javascript函数?
看看下面的课程:
function Class()
{
this.publicMethod = function()
{
alert("hello");
}
privateMethod = function()
{
publicMethod();
}
this.test = function()
{
privateMethod();
}
}
Run Code Online (Sandbox Code Playgroud)
这是我运行的代码:
var class = new Class();
class.test();
Run Code Online (Sandbox Code Playgroud)
Firebug给出了这个错误:
publicMethod未定义:[中断此错误] publicMethod();
是否有其他方法可以在privateMethod()中调用publicMethod()而无需访问全局类变量[即class.publicMethod()]?