预处理器的限制__VA_ARGS__长度?

时间:2017-11-12 15:04:45

标签: c c-preprocessor

我正在使用预处理器宏va_args hack for SQL代码,允许直接在sqlite3.exe中粘贴,以便进行快速的无构建调试:

#define QUOTE(...) #__VA_ARGS__
char const example[] = QUOTE(
  INSERT INTO Some_Table(p, q) VALUES(?, ?);
); 

https://stackoverflow.com/a/17996915/1848654

然而,这几乎不应该使用__VA_ARGS__。特别是我的SQL代码包含数百个令牌。

__VA_ARGS__长度的限制(如果有的话)是什么?

1 个答案:

答案 0 :(得分:2)

我唯一能找到的是C99中的这一位(C11仍包含相同的文字):

  

5.2.4.1翻译限制

     
      
  1. 实现应能够翻译和执行至少一个程序   包含以下每个限制的至少一个实例: 13)

         
        
    • [...]
    •   
    • 一次宏调用中的127个参数
    •   
    • [...]
    •   
    • 字符串文字或宽字符串文字中的4095个字符(连接后)
    •   
    • [...]
    •   
  2.         

    [...]

         

    13)实施应尽可能避免强加固定的翻译限制。

因此根据标准没有固定限制。您将不得不检查您的编译器是否记录了任何限制,或者只是尝试支持您抛出的任何内容(直到它耗尽RAM或其他东西)。