标签: preprocessor-directive

不区分大小写的#define

是否可以使用预处理器发出不区分大小写的#define语句?

例如,我想将foobar的任何外壳转换为spameggs,即:

FooBar -> spameggs
foobar -> spameggs
fooBar -> spameggs
Foobar -> spameggs
FOOBAR -> spameggs
FOOBAr -> spameggs (an odd possibility I know)
etc
Run Code Online (Sandbox Code Playgroud)

这背后的原因是我想#define一些fortran子程序有不同的名称,它们当然不区分大小写.请注意,我并不真正关心保留大写方案(在最后一个例子中看起来有点无稽之谈).

c-preprocessor preprocessor-directive

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

#if(DEBUG)和log4net行号源/运行时不匹配

当我使用预处理器指令时

1 #if(DEBUG)
2 // 1
3 // 2
4 #else
5 // 1
6 // 2
7 #endif
8
9 logger.Debug("Log exception, etc."); 
Run Code Online (Sandbox Code Playgroud)

它导致在运行时日志中的行号(例如堆栈跟踪)不正确 - 在上面的示例中,第9行将变为4,因为其余部分将由预处理器解析.

它使日志分析非常困难.

有没有办法解决这个问题,而无需创建方法ConditionalAttribute?

我知道Debugger.IsAttached(现在我正在使用这个解决方案)但我更愿意根据构建模式(调试/发布)运行代码而不是调试器是否附加.

c# logging log4net c-preprocessor preprocessor-directive

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

'#type'在Haskell外部函数接口中的含义是什么?

我在Haskell sendfile包中找到了这段代码:

http://patch-tag.com/r/mae/sendfile/snapshot/current/content/pretty/src/Network/Socket/SendFile/Linux.hsc

-- sendfile64 gives LFS support
foreign import ccall unsafe "sendfile64" c_sendfile
  :: Fd -> Fd -> Ptr (#type off64_t) -> (#type size_t) -> IO (#type ssize_t)
Run Code Online (Sandbox Code Playgroud)

1)什么#type意思和2)为什么我会得到这个错误,

[1 of 1] Compiling Linux.Splice     ( splice.hs, splice.o )

splice.hs:40:12: parse error on input `type'
Run Code Online (Sandbox Code Playgroud)

当我自己尝试使用它如下?:

ghc --make splice.hs
Run Code Online (Sandbox Code Playgroud)

splice.hs:

{-# LANGUAGE ForeignFunctionInterface #-}

module Linux.Splice where

import Data.Word
import System.Posix.Types

-- SPLICE

 -- fcntl.h
 -- ssize_t splice(
 --   int          fd_in,
 --   loff_t*      off_in,
 --   int          fd_out, …
Run Code Online (Sandbox Code Playgroud)

c haskell types ffi preprocessor-directive

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

C++编译时间宏来检测windows os

是否存在任何C++编译时宏来检测正在编译代码的Windows操作系统.我基本上只想在Win7上支持某些功能.所以我有兴趣做这样的事情

#if <os_macro> = WIN7
  // This function would do something valid only on Win7 builds.
  bool myfunction {
        // do something here
  }
#else
  // This function would typically return false, since its not supported on OS below win7
  bool myfunction {
       return false;
  }
#endif 
Run Code Online (Sandbox Code Playgroud)

还有其他更好的方法吗?

c++ windows header windows-7 preprocessor-directive

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

从代码库中删除/应用ifdef的/ else的工具

我有一个非常大的代码库,我想通过删除并应用散布在它周围的一些ifdef来清理它.例如,我有很多这样的:

test.c的

#ifdef MYCHECK
    // do other sutff
#else
    // do stuff
#endif
Run Code Online (Sandbox Code Playgroud)

是否有一个工具允许我运行整个代码库并删除所有代码,只留下我的变量条件中的代码?例如:

nicetool -D MYCHECK *.c
Run Code Online (Sandbox Code Playgroud)

会导致:

test.c的

// do other stuff
Run Code Online (Sandbox Code Playgroud)

c preprocessor-directive

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

检查是否定义了uint64_t

uint64_t不保证在32位平台上定义类型,并且代码类似

int main() {
  uint64_t i = 0;
}
Run Code Online (Sandbox Code Playgroud)

可能会导致类型的编译错误incomplete type.

是否有预处理程序指令来检查是否uint64_t存在?检查类型是否已定义的任何其他方式?

c++ types preprocessor-directive

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

是否可以在预处理时或编译时修改"函数调用"

第一个问题:是否可以使用某些参数调用一个函数,并在编译之后在预处理时或编译时将其修改为其他类似的东西

#define func(a,b) func(a,sizeof(a),b)
Run Code Online (Sandbox Code Playgroud)

有些人可能会想到为什么会出现这样的需求.

实际上我使用visual studio 2010在Windows中移植代码,并且有一些函数被弃用,如strcpy(),strcat()等.它说使用strcpy_s()代替.

我知道我可以使用#pragma disable(warning: )或通过提供以下标志来抑制它:

_CRT_NONSTDC_NO_DEPRRECATE
_CRT_SECURE_NO_DEPRECATE
_CRT_SECURE_NO_WARNINGS
Run Code Online (Sandbox Code Playgroud)

但我不想忽视或压制它们.

我试着只是简单地替换字符串而不是忽略使用:

#define strcpy strcpy_s
Run Code Online (Sandbox Code Playgroud)

就像在这里http://msdn.microsoft.com/en-us/library/td1esda9.aspx我读过,如果我不提供第二个arg,那么参数不会不匹配.

我的意思是如果我这样使用它应该没问题:

#define strcpy strcpy_s
strcpy(dest,src);
Run Code Online (Sandbox Code Playgroud)

但事实并非如此.它仍然会产生警告.

strcpy_s的定义是:

errno_t strcpy_s(
   char *strDestination,
   size_t numberOfElements,
   const char *strSource 
);
Run Code Online (Sandbox Code Playgroud)

第二个问题:第一个参数是一个指向动态分配内存的指针,所以如何获得该指针指向的内存大小.虽然我读到这是不可行的,但必须有某种方式(希望如此).

顺便问一下是_countof(var)什么?

c macros visual-studio-2010 preprocessor-directive

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

为什么我们使用预处理器指令来定义变量?

我有一段这样的代码:

/* T matrix */
#define T11     0
#define T12_re  1
#define T12_im  2

int main(int argc, char *argv[])
{
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么它使用预处理程序指令来定义全局变量,而不是简单地使用如下代码:

/* T matrix */
double T11 = 0;
double T12_re = 1;
double T12_im = 2;

int main(int argc, char *argv[])
{
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

c++ variables global-variables c-preprocessor preprocessor-directive

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

#define多行的字符串

我想知道如何在多行上定义一个非常长的字符串.我尝试了很多不同的模式,但它们都没有工作.这是我的代码.

#define EXAMPLE "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
                "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
                "ccccccccccccccccccccccccccccccccccc"
                "ddddddddddddddddddddddddddddddddddd"
Run Code Online (Sandbox Code Playgroud)

我得到语法错误.我得到的错误是

ccompile.h (as included in test.c)
=================
error: syntax error before or at: g
*** Error code 2
Run Code Online (Sandbox Code Playgroud)

我想把"aaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbccccbccccccccdddddddd"分配给EXAMPLE.

我尝试使用\和@ \但这没有用.

c string string-literals c-preprocessor preprocessor-directive

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

条件包含:整数常量表达式是否有限?

C11,6.10.1 有条件包含,约束,1(强调):

控制条件包含的表达式应为整数常量表达式

C11,6.6 常量表达式,6(强调):

整数常量表达式117)应具有整数类型,并且只能具有整数常量、枚举常量、字符sizeof常量、结果为整数常量的表达式、_Alignof表达式以及作为强制转换的直接操作数的浮点常量的操作数。

$ cat t333.c
#if (int)1.0
#endif

$ gcc t333.c -std=c11 -pedantic -c
t333.c:1:10: error: missing binary operator before token "1.0"
    1 | #if (int)1.0
Run Code Online (Sandbox Code Playgroud)

这里(int)1.0是整型常量表达式。它具有整数类型并具有操作数,该操作数是浮点常量,是强制转换的立即操作数。但是,每个gcc代码都是无效的。

这意味着 6.10 预处理指令中使用的“整数常量表达式”受到限制 [1]?标准中有明确规定吗?

[1] 例如,“除了sizeof结果为整数常量、_Alignof表达式和作为强制转换的直接操作数的浮点常量的表达式”

c language-lawyer constant-expression c-preprocessor preprocessor-directive

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